#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]中;