#include<stdio.h>
#include<string.h>
void main()
{
char ch1[8];
char ch2[3] = "df";
char ch3[2][2];
int i = 0;
printf("first printf:%s", ch2); // (1)
strcpy(*(ch3+1) , ch2);
while(ch3[1][i] != '/0')
i++;
printf("%d",i); //(5)
printf("/nsecond printf:%s", *(ch3+1)); //(2);
printf("/nthird printf:%s", ch2); //(3)
strcpy(ch1, ch2);
printf("/nfourth printf:/n%s", ch1); //(4);
return;
}
只有(1)行打出了df ,(2)(3)(4)行均未打出字符,第(5)行打出数字2;
1.通过运行这个程序,发现ch2已是空字符数组;为什么ch2的字符数组内容变了?
2.ch3二维数组的第二行,经过赋予两个字符后,应该已经越界,为什么,在紧接着的ch2[2] = '/0'?
#include<stdio.h>
#include<string.h>
void main()
{
char ch1[8];
char ch2[3] = "df";
char ch3[2][2];
int i = 0;
printf("first printf:%s", ch2); // (1);
strcpy(*(ch3+0) , ch2);
while(ch3[0][i] != '/0')
i++;
printf("%d",i); // (5);
printf("/nsecond printf:%s", *(ch3+0)); // (2);
printf("/nthird printf:%s", ch2); // (3)
strcpy(ch1, ch2);
printf("/nfourth printf:%s", ch1); // (4);
return;
}
这个程序,只将ch2赋予了ch3[0]而已的改动,但得出了正确的打出结果,即(1)(2)(3)(4)都打出df,(5)打出数字2;
在调试过程中发现ch[0][2] == '/0'与ch[1][0] == '/0',推测这两个元素是否占用同样的内存?
通过调试上面这两个程序,发现在给ch2,ch3分配内存时,ch2起始地址:ox0012ff74,ch3起始地址:ox0012ff70
在第一个程序中,ch3[1]越界至ox0012ff74,给此地址,赋予'/0';而strcpy与printf函数,在拷贝与打出字符串内容时,都是以'/0'为结束,标志,这就是为什么ch2字符数组内容变为空字符串的原故.
而在第二个程序中,实际上ch3[0]也发生越界,不过是ch3中的"内部"越界,'/0'赋予到了ch3[1][0]中;