#include<stdio.h>
#include<string.h>
int main(){
char str[]="123";
char str1[]="12345678";
char str2[]="huang lao ba zi";
strcpy(str,str1);
printf("%s\n",str);
strcpy(str,str2);
printf("%s\n",str);
return 0;
}
结果:
12345678
huang lao ba zi
我用的时Linux下的gcc(4.4.7)编译的,为何显示结果并没有溢出,而是全部显示出来呢
这个就是溢出的结果啊,str本来只存123\0 ,strcpy之后你的str都变了
详细过程可以看这个
首先字符串的最后一位是/0
%s 打印的是字符串打印到/0为止,而不是只打印数组的长度。
改成这样你就能看到数组越界了,全局变量在一起定义时在内存上是连续存放的。
#include<stdio.h>
#include<string.h>
char str[]="123";
char str1[]="12345678";
char str2[]="huang lao ba zi";
int main(){
strcpy(str,str2);
printf("%s\n",str);
printf("%s\n",str1);
printf("%s\n",str2);
return 0;
}
str字符数组初始设置"123\0",最大长度为4,
如果你strcpy复制的字符超过4个,数组下标会越界溢出
c语言中数组下标溢出不会报错, 多于的字符会写入到数组分配空间之后的未知空间中,
虽然可以这样但不安全。因为这个内存空间可能会分配给其它变量,当这个变量的值改变时数组也就受到影响。
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!