我只是想知道爲什麼下面這段代碼的輸出是abcdef def
而不是abc def
。數組的簡單問題
main()
{
char array1[3]="abc";
array1[3]='\0';
char array2[3]="def";
array2[3]='\0';
printf("%s %s", array1, array2);
}
我只是想知道爲什麼下面這段代碼的輸出是abcdef def
而不是abc def
。數組的簡單問題
main()
{
char array1[3]="abc";
array1[3]='\0';
char array2[3]="def";
array2[3]='\0';
printf("%s %s", array1, array2);
}
char array1[3]="abc";
array1[3]='\0';
char array2[3]="def";
array2[3]='\0';
array1[3]='\0';
和array2[3]='\0';
語句訪問數組越界和調用未定義的行爲。 3個元素的數組的最後一個元素是array1[2]
而不是array[3]
。
要解決你的程序,你的聲明數組作爲:
char array1[]="abc";
char array2[]="def";
不要手動添加空終止,因爲它會被已經包含在聲明之上。
EDIT:
一些其他的答案錯誤地認爲
char array1[3]="abc";
會寫陣列外部的後空字符。實際上在這個初始化中沒有寫入結尾的空字符。當你做
char array1[3]= {'a', 'b', 'c'};
:
char array1[3]="abc";
然後array1[3]
超出範圍的聲明等效於。
你應該這樣做:
char array1[4]="abc"; //Remember the '\0'
^^^
注意,'\0'
會以這種方式加入。
另外請注意,當你有大小爲N
的數組時,那麼索引是從0
到N - 1
。
*它增加了'\ 0'*實際上這是一種特殊情況,沒有'\ 0'被添加到'char array1 [3] =「abc」中;'因爲字符串的長度與數組的大小相同, – ouah
在你的代碼
main()
{
char array1[3]="abc"; //Undefined ,when you access this using printf() with %s
array1[3]='\0'; //here you are storing value which is out of bound in nature
char array2[3]="def"; //same as above
array2[3]='\0'; //same as above
printf("%s %s", array1, array2);
}
memory:
---------------
| a | b | c |\0|
----------------
最後\ 0你是把比你分配的空間更多。
解決方案:
main()
{
char array1[4]="abc";
//array1[3]='\0'; //no need
char array2[4]="def";
// array2[3]='\0'; //no need
printf("%s %s", array1, array2);
}
它會給所需的輸出
這是這樣一個糟糕的代碼!發生的情況如下:
編譯器爲2x3字符分配空間。
main()
{
char array1[3]="abc"; //Will write "abc" in array 1 AND \0 in array2[0]
array1[3]='\0'; //Out of array!!! (Re)writing \0 in array2[0]
char array2[3]="def"; //Will write "def" in array2 AND \0 after array2 space, POTTENCIALLY corrupting code!
array2[3]='\0'; //\0 (re)wrote after array2, POTTENCIALLY corrupting code!
你在內存中有7個字節(只分配了6個):「abcdef \ 0」。 指針仍然正常:array1指向「a」,array2指向「d」。 在C標準庫中,字符串大小通過結束零終止符來確定。所以當你printf array1時,它會讀取「abcdef」直到\ 0。
*將在數組1中寫入「abc」並且在數組2中寫入\ 0 [0] *這是錯誤的,不會寫入''\ 0''。請參閱我的答案中的編輯。 – ouah
給我們實際工作的代碼。你的主要定義是無效的。 – darxsys
'char array1 [3 + 1] =「abc」;'+1爲字符串末尾 – BLUEPIXY
'char array1 [3] =「abc」;'在vs2008中不允許。我試過,錯誤C2117:'array1':發生數組邊界溢出。 –