2014-03-13 111 views
3
char a[3]={'U','S','A'}; 
cout<<a; 

它怎樣才能打印USA當a是長度爲3的字符數組,而沒有內存'\0'
哪裏會存儲'\0'C++字符串大小錯誤

+7

未定義的行爲。數組之後恰好有一個'0'。 – juanchopanza

+0

std :: cout.write(a,sizeof(a)) –

+1

反正你應該使用'std :: string' – Brian

回答

-4

插入終止:

char a[4]={'U','S','A', '\0' }; 

4

COUT將打印直到遇到\ 0。

現在,如果碰巧在物理內存中,數組旁邊的字節值爲0,cout將把它作爲終止符。它可能發生,因爲下一個字節可能有任何垃圾值,包括0.

但是,不能保證你的陣列邊界旁邊會有什麼。在其中一種情況下,您發現0並不意味着它會繼續用於其他情況。實際結果是未定義的行爲,在這種特殊情況下,它與數組以null結尾的情況下預期的cout行爲相匹配。

-3

Q:如果a是長度爲3的字符數組,並且 沒有內存'\ 0',它如何打印USA?

只需打印陣列中的所有字符。

例如

for (char c : a) std::cout << c; 
std::cout << std::endl; 

在這種情況下終止零不是必需的。

如果你的編譯器不支持基於for語句的範圍內,那麼你可以使用一個普通的循環:

for (size_t i = 0; i < sizeof(a); i++) std::cout << a[i]; 
std::cout << std::endl; 

或者實際上你可以使用成員函數write

std::cout.write(a, sizeof(a)); 

如果你將它打印以下方式

std::cout << a; 

那麼程序就會有你ndefined行爲。不能保證在數組之後內存中會有一個零字節。