c语言指针问题,为什么我输入很多个都没有显示错误?
因为C语言不提供内存越界访问检查机制,p在堆内存上申请了一个char长度空间(注意:malloc实际分配的内存有可能比请求的稍微多一点,但是这个行为是由编译器定义的,所以不能指望它肯定会分配比请求更多的内存)。你在随后输入一个字符串时候,通过scanf函数读取到p指针指向的内存中,虽然只申请了一个字节空间,但其后的内存因为(通常)不是非法地址,所以也能被操作。
这个错误在实际软件开发时,经常会发生且不容易发现。假如操作的越界内存是一块非法地址,程序将会终止。这个错误在unix/linux系统上称为“段错误”。它提示程序试图访问一个并未分配给程序的内存位置。这还属于比较好的情形,最可怕的是:如果这个越界的地址是一个合法地址(如你的例子中),接下来,如果有其他变量正在使用这块内存,其中的值被无意修改了,并且这种错误很难发现。所以对指针的操作要异常小心。
另外你可以试试,即使定义这个p指针为
char
p[1];栈中内存,也能进行错误操作如:
12345678p[-1] = 'l'; //“错误操作”p[0] = 'o';p[1] = 'v'; //“错误操作”p[2] = 'e'; //“错误操作”char *temp = p; --temp; printf("%s\n", p); //打印 oveprintf("%s\n", temp); //将打印 love
绛旓細鍥犱负C璇█涓嶆彁渚涘唴瀛樿秺鐣岃闂鏌ユ満鍒讹紝p鍦ㄥ爢鍐呭瓨涓婄敵璇蜂簡涓涓猚har闀垮害绌洪棿锛堟敞鎰忥細malloc瀹為檯鍒嗛厤鐨勫唴瀛樻湁鍙兘姣旇姹傜殑绋嶅井澶氫竴鐐癸紝浣嗘槸杩欎釜琛屼负鏄敱缂栬瘧鍣ㄥ畾涔夌殑锛屾墍浠ヤ笉鑳芥寚鏈涘畠鑲畾浼氬垎閰嶆瘮璇锋眰鏇村鐨勫唴瀛橈級銆備綘鍦ㄩ殢鍚杈撳叆涓涓瓧绗︿覆鏃跺欙紝閫氳繃scanf鍑芥暟璇诲彇鍒皃鎸囬拡鎸囧悜鐨勫唴瀛樹腑锛岃櫧鐒跺彧鐢宠浜嗕竴涓瓧鑺...
绛旓細鍥犱负C璇█涓嶆彁渚涘唴瀛樿秺鐣岃闂鏌ユ満鍒讹紝p鍦ㄥ爢鍐呭瓨涓婄敵璇蜂簡涓涓猚har闀垮害绌洪棿锛堟敞鎰忥細malloc瀹為檯鍒嗛厤鐨勫唴瀛樻湁鍙兘姣旇姹傜殑绋嶅井澶氫竴鐐癸紝浣嗘槸杩欎釜琛屼负鏄敱缂栬瘧鍣ㄥ畾涔夌殑锛屾墍浠ヤ笉鑳芥寚鏈涘畠鑲畾浼氬垎閰嶆瘮璇锋眰鏇村鐨勫唴瀛橈級銆備綘鍦ㄩ殢鍚杈撳叆涓涓瓧绗︿覆鏃跺欙紝閫氳繃scanf鍑芥暟璇诲彇鍒皃鎸囬拡鎸囧悜鐨勫唴瀛樹腑锛岃櫧鐒跺彧鐢宠浜嗕竴涓瓧鑺...
绛旓細閭f槸鐢变簬浣爄nput1[12],input2[12]鏄彧鍒嗛厤浜12涓猚har鍨嬬殑鍐呭瓨绌洪棿锛屽鏋滀綘杈撳叆瓒呴暱鐨勫瓧绗︿覆锛岀敱浜庤秴鍑轰簡瀛樺偍绌洪棿鐨勯暱搴︼紝缂栬瘧鍣ㄤ笉浼氭姤閿欙紝浼氱户缁悜鍚庨潰鐨勫瓨鍌ㄥ尯鍩熷啓鏁版嵁锛屽鑷磇d[12],code[12]涓瓨鍌ㄧ殑鏁版嵁琚敼鍐(杩欎釜浣犺皟璇曠殑鏃跺欏療鐪嬩竴涓嬭繖涓や釜瀛楃涓茬殑鍊煎氨鍙互鍙戠幇)锛屾墍浠d[12]鍜宑ode[12]涓...
绛旓細骞舵墦鍗板嚭鏉ワ紝鍙互寰幆鎺ュ彈杈撳叆锛鐩村埌鐢ㄦ埛杈撳叆绌鸿涓烘int main(void){char s[81];do{puts("璇疯緭鍏ヤ竴浜涘瓧绗︼細");gets(s);puts("OK,鎴戜滑甯綘鍘绘帀浜嗙┖鏍硷紝璁板緱鐐硅禐鍝︼細");del_space(s);//璋冪敤鍘荤┖鏍煎嚱鏁皃uts(s);
绛旓細5.C 鏄鐨勶紝鍘熷洜鏄*p=*q,琛ㄧず鐨勬槸*p=j銆傛鏃秈鐨勫间篃鏀瑰彉浜嗭紝绛変簬j;6.閫夐」A,鏃㈢劧鎸囬拡鍙橀噺宸茬粡涓篘ULL锛屾庝箞杩樺彲杈撳叆鍛紵锛烞,鍚屼笂 c:char t='m', *c=&t;*c=&t;鏀逛负锛歝har t='m', *c=&t;c=&t;灏卞浜嗭紝鍥犱负鍓嶉潰鐨勨*鈥欒鏄巔鏄釜鎸囬拡鍙橀噺锛屼笅闈㈠氨涓嶈甯 瑕佹槸妤间富鍐嶄笉鎳傜殑璇...
绛旓細printf("璇杈撳叆10涓暣鏁:");p=a;for(i=0;i<10;i++)//scanf鍙傛暟鍐欓敊浜嗭紝骞朵笖p++鍚庯紝灏卞凡缁忔寚鍚戜笅涓涓綅缃簡锛屼絾鏄叾瀹炰綘杩樻病鍦ㄩ偅涓綅缃祴鍊硷紝鎵浠=s+(*p)灏变細涓嶆纭 { scanf("%d",p);s=s+(*p);p++;} q=s/10;p=a,i=0;//for(;p<(a+10);p++)//浣犲師鏉ョ殑杩欎釜鍙ュ瓙涔熸槸鏈...
绛旓細浣犵殑q 鏄嚱鏁鎸囬拡 鑰屼笉鏄簩缁存寚閽堛傝繖鏍穛=&p1鐨勬椂鍊 灏卞凡缁忕被鍨嬮敊璇傚浜庡嚱鏁版寚閽堛 *q **q 涓嶇澶氬皯涓* 锛岄兘鏄湰韬殑鍊笺傝繖涓槸鍑芥暟鎸囬拡鐨勪竴涓壒鍒瀹氥傛寜鐓т綘鐨勫啓娉曪紝 q鐨勫畾涔夊簲璇ユ槸int **q; 鑰屼笉鏄嚱鏁版寚閽堛
绛旓細scanf("%d%d",p1,p2);鏄杈撳叆鍒皃1鎸囧悜鐨勫璞★紙涔熷氨鏄痑锛夊拰p2鎸囧悜鐨勫璞★紙涔熷氨鏄痓锛夈傚洜涓簆1灏辩瓑浜&a锛宲2绛変簬&b锛屾墍浠canf("%d%d",p1,p2);鍜宻canf("%d%d",&a,&b);鎰忎箟鐩稿悓 濡傛灉鏄緭鍏ュ埌鎸囬拡锛闇瑕佺敤scanf("%p%p",&p1,&p2);锛屽綋鐒朵竴鑸笉瑕佽繖鏍峰仛鈥︹...
绛旓細鎵撳嵃鐨勬槸p鑰屼笉鏄*p 涔熷氨鏄暟缁刟鐨勯鍦板潃銆傝繖鏄竴涓殢鏈哄硷紝 鐪嬬郴缁熷垎閰嶃
绛旓細鎰熻浣 x 鍑芥暟鐨勯昏緫寰堝鎬紝姣斿绗竴涓惊鐜垰寮濮 *q 鎸囧悜 a[5]锛宎[5]骞舵病鏈夎璧嬪硷紝浣嗘槸浣犲嵈鎵ц浜嗕竴娆 *(q+m) = *q;鎴戦噸鏂板啓浜 x 鍑芥暟缁欎綘鍙傝冨惂锛歷oid x(int *q,int m){ int i;int *t = q;for(i=m;i>0;i--)t++=*(q-i);for(i=0;i<5-m;i++)t++=*(q-...