代码分析:代码如下:
char s[5] = "phone";//这个空间大小为5 ,字符串隐藏\0,作为字符串的结束标志.
char str2[10], str3[10] ; //定义 str2,str3,两个字符数组,空间大小为10, 默认有隐藏字符\0;
for (int i =0; i< 10; i++) {
str2[i] = 'a'; //将字符'a'遍历10次,保存到str2中,赋值结束,出现溢出现象,\0被溢出,即,没有结束标志.
printf("%c ", str2[i]);
}
strcpy(str3, str2);
printf("str3 = %s\n",str3); //结果aaaaaaaaaaphone
printf("str2 = %s\n",str2); //结果phone
分析如下:
str2 和 str3 出现此结果的情况 :str2内的值赋值为str3,因为str2溢出,,
数组内存开辟空间是从高地址到底地址存储. 即由高到低的存储顺序为 s -> str2 -> str3但给对应字符数组空间赋值,是从低到高,进行赋值,所以,当开始赋值结果如下:
值域,即空间大小 111111111.. ---------------------------------------------- 0
3个字符串存储对应空间位置 : (enohp)(0/xxxxxxxx)(0/xxxxxxxxx) //括号为了方便区分. \0,即每个字符串都隐藏结束标志. X代表存储空间无值.
对应字符数组: -s- ---str2--- ---str3---
第一步 : 将10个字符'a'遍历存入到字符数组str2中,分析:因为空间本身大小为10,如果讲10个'a'存储进去,就会造成溢出,即对应字符数组中将没有\0,即没有字符串结束标志.存储结果如下:
3个字符串存储对应空间位置 : (enohp)(aaaaaaaaaa)(0/xxxxxxxxx) //括号为了方便区分. \0,即每个字符串都隐藏结束标志. X代表存储空间无值.
对应字符数组: -s- ---str2--- ---str3---
第二步 : strcpy(str3,str2); 即将 str2中的字符串,复制到对对应的字符数组str3中,分析:
1. 因为str3字符数组空间大小为10,即当把str中得元素复制到str3中,也将会存在溢出,而且存储后无\0.
2. 将str2中的值复制给str3,但因为 str2和字符数组s之间都没有结束标志,所以对应值会不断的将后序值替换,及相当于像右平移).
3.因为没有\0结束标志,所以复制过程不结束,知道出现 \0,结束标志.结果如下:
字符串存储对应空间位置 : (知道出现\0)....xxxxxxx(xxxxx)(enohp)(aaaaaaaaaa) //括号为了方便区分. \0,即每个字符串都隐藏结束标志. X代表存储空间无值.
对应字符数组: -s- -str2- ---str3---
即" str3 = aaaaaaaaaaphone;
str2 = phone ;