2012-08-24 37 views
1

我無法理解此代碼輸出的異常行爲。 它打印:在C++中出現這種異常輸出的原因

​​3210

代碼是在這裏:

#include <iostream> 
#include <cstdio> 
using namespace std; 

int main() 
{ 
printf(" hellooo \n"); 
char name[7]="sonuka"; 
char name1[4]={'m','o','n','u'}; 
printf("%s",name1); 
system("pause"); 
return 0; 
} 
+3

對於你來說,包含'{'m','o','n','u'}'的數組在'sonuka'之前就已經在內存中了用'\ 0'結尾一個字符串)。使用'%s'修飾符將使'printf'讀取直到它遇到空終止符('name1'沒有,因爲它不是C風格的字符串。 – birryree

+2

5個答案在4秒內...這就是goota是一個記錄 –

+1

@LuchianGrigore你在哪裏?:) – ouah

回答

3

name1必須以NULL結尾,否則printf將打印的字節數,因爲它發現,直到擊中\0

它必須是

char name1[5]={'m','o','n','u', '\0'}; 

你有什麼是未定義行爲:內存後printf打印內存,分配給name1

在這種情況下,它看起來像你的編譯器放置在內存namename1後,這就是爲什麼他們都打印(name是正確NULL封端的,因爲所有的文字都是)。

6

name1陣列不與零字符('\0')終止。函數printf打印字符,直到找到零。在你的情況下,它會超過數組的末尾。會發生什麼是未定義的行爲。一個可能的結果是,其他變量或垃圾被打印到屏幕上,直到內存中的其他地方最終被擊中,但包括程序崩潰在內的任何事情都可能發生。

1

name1不是空終止的,所以printf只是保持打印字符,直到達到\0

1
printf("%s",name1); 

s轉換說明符要求參數是指向C字符串的指針。

char name1[4]={'m','o','n','u'}; 

不是C字符串,因爲數組不是空終止。違反轉換精靈的要求調用未定義的行爲,這就是爲什麼你會得到這個意想不到的結果。

+0

爲什麼這個答案downvoted,感謝解釋。 – ouah

0

你試圖用printf打印一個字符數組作爲字符串。試試這段代碼:

int pointer=0; 
while(pointer < 4){ 
    printf("%c",name1[pointer]); 
    pointer++; 
}