今天网上看到了一个有关C语言越界的问题。代码如下:请问输出的是什么?
#include <stdio.h>
#include <string.h>
int main(void){
char s[]="abcdefghijklmnopqrstuvwxyz";
char d[]="123";
strcpy(d,s);
//printf("s:%p d: %p\n",s,d);
printf("s:%s d: %s\n",s,d);
return 0;
}
部分人觉得要越界也是d越界呀,d的数据肯定不完整,我当时直觉也是这么认为的,但是实际却不是这样的,先来看下输出的是什么:
我们再来打印数组s和d的地址看看d的数组越界到哪里去了?
输出结果是这样的:
这就可以解析了,d的地址从......10开始 ,s的地址从......20开始这中间是16个字节,就是说strcpy把s的26个字母(26个字节)复制到d的地址从0x7fffca30ef10开始到0x7fffca30ef10+27个字节占用的地址大小,那就把S的数组覆盖掉了前面10个字节,即strcpy后从0x7fffca30ef20地址开始的字母就是复制后d数组的后10个字母,即第17个字母开始,又因为strcpy复制数组会在末尾添加结束符,所以当打印输出S数组时就碰到结束符停止显示,所以最后S输出:qrstuvwxyz
最后居然知道内存越界了,那就注意分配内存空间的大小;
#include <stdio.h>
#include <string.h>
int main(void){
char s[]="abcdefghijklmnopqrstuvwxyz";
char d[26]="123";
strcpy(d,s);
printf("s:%p d: %p\n",s,d);
printf("s:%s d: %s\n",s,d);
return 0;
}
输出:
这就是经常说的细节决定成败咯!