2013-07-18 150 views
-2

是不是說編譯器自動添加了終止C字符串的null是正確的?C字符串的空終止

因此,在下面的例子:

char * str = "0124"; 
printf("%x", str[str[3] - str[2] + str[4]]); 

輸出總是32?

謝謝。

+3

EBCDIC機器上的輸出可能不是32。 –

+1

-1你爲什麼對那個怪誕的'printf'輸出感興趣?這只是分散你的問題,不是嗎?請重新制定。 –

+1

它給了我一個警告「不贊成將字符串常量轉換爲'char *'」。你應該使用char const * str =「0124」 – poorvankBhatia

回答

1

是,編譯器確實增加空終止。因此有5個字節的內存分配給堆棧。 (str [3] - str [2] + str [4])的計算結果爲(52 - 50 + 0),所以你正在訪問str [2],它將在十六進制中打印0x32。

3

第一個問題:是

第二個問題,是一個ASCII系統上:您計算'4' - '2' + '\0'這是在整數:0x34 - 0x32 + 0 = 2,所以你得到str[2]這是'2'這是0x32。 '4' - '2'爲2在C中定義,但如果你的EBCDIC系統上運行的代碼,'2'是0xf2

+1

FWIW:無論ASCII,EBCDIC或任何其他符合C字符集設置爲數字字符,「4」 - 「2」+「\ 0」都將爲2需要連續。 – chux

1

終止空字符由編譯器添加; 6.4.5p6:

6 - 在翻譯階段7,字節或零值代碼被附加到從字符串產生字面或文字每個多字節 字符序列。多字節字符 然後用於初始化一個靜態存儲持續時間和長度的數組,只需要包含該序列就足夠了。 [...]

printf輸出將是系統中2字符的字符代碼。字符09保證具有連續的代碼(5.2.1p3),但不具有任何特定的值。