2013-07-18 137 views
0

我只是想知道爲什麼下面這段代碼的輸出是abcdef def而不是abc def數組的簡單問題

main() 
{ 
    char array1[3]="abc"; 
    array1[3]='\0';  

    char array2[3]="def"; 
    array2[3]='\0'; 

    printf("%s %s", array1, array2); 
} 
+2

給我們實際工作的代碼。你的主要定義是無效的。 – darxsys

+0

'char array1 [3 + 1] =「abc」;'+1爲字符串末尾 – BLUEPIXY

+0

'char array1 [3] =「abc」;'在vs2008中不允許。我試過,錯誤C2117:'array1':發生數組邊界溢出。 –

回答

6
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'}; 
3

char array1[3]="abc";

然後array1[3]超出範圍的聲明等效於。

你應該這樣做:

char array1[4]="abc"; //Remember the '\0' 
      ^^^ 

注意,'\0'會以這種方式加入。

另外請注意,當你有大小爲N的數組時,那麼索引是從0N - 1

+0

*它增加了'\ 0'*實際上這是一種特殊情況,沒有'\ 0'被添加到'char array1 [3] =「abc」中;'因爲字符串的長度與數組的大小相同, – ouah

1

在你的代碼

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); 
} 

它會給所需的輸出

+1

好的答案+1。 – Maroun

+0

@ Maroun Maroun:謝謝 – pradipta

0

這是這樣一個糟糕的代碼!發生的情況如下:

編譯器爲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。

+0

*將在數組1中寫入「abc」並且在數組2中寫入\ 0 [0] *這是錯誤的,不會寫入''\ 0''。請參閱我的答案中的編輯。 – ouah