2013-02-10 87 views
0

我的代碼是這樣的:奇怪結果(' 210`)打印字符數組的末尾時

int main(int argc, char *argv[]) 
{ 
    char ca[] = {'0'}; 
    cout << *ca << endl; 
    cout << *(ca+1) << endl; 
    cout << ca[1] << endl; 
    cout << (char)(0) << endl; 
    return 0; 
} 

結果是這樣的:

0 
\210 
\210 
^@ 

this thread,我知道即^@實際上與\0相同。但是,\210似乎不是因爲當我使用hexdump來查看結果。

bash-3.2$ ./playground | hexdump -C 
00000000 30 0a 88 0a 88 0a 00 0a       |0.......| 
00000008 

可以清楚地看出,\21088而不是00

據我所知,ca+1應指向null terminator,這是\0。但爲什麼cout << *(ca+1) << endl;結果給我\210

+0

嘗試'char ca [] =「0」;',然後閱讀aaaaaa123456789的答案爲什麼它的工作。 – WhozCraig 2013-02-10 08:30:43

回答

4

因爲在聲明字符array時必須手動添加空終止符。如果你使它成爲字符串(如在char myString[] = "hi"),那麼它將添加一個空終止符。但是,如果你使它成爲一個數組,與大括號,它不會。

至於0x88字節,它恰好是RAM中的下一個字節,無論出於何種原因。

2

在任何有效的C程序中,字符串文字總是以null結尾。這裏您試圖初始化字符數組的個別元素,但僅使用列表初始化語法而不是字符串文字。由於這是使用相同函數分配的靜態數組,所以您甚至可以在sizeof運算符的幫助下進行確認。 做ca應該給你1即一個字符數組。然而,如果你已經做了類似char ca[] = "0";那麼應用sizeof(ca)應該給你2即字符'0'和空終止字符。作爲aaaaaa123456789提到,這只是一個輸出,現在你正在獲得,只是在內存中的另一個字節。如果你在某個不同的時間運行它,你會看到不同的輸出,或者你的程序可能會崩潰。引用錯誤的位置可能導致任何運行時異常。