是不是說編譯器自動添加了終止C字符串的null是正確的?C字符串的空終止
因此,在下面的例子:
char * str = "0124";
printf("%x", str[str[3] - str[2] + str[4]]);
輸出總是32?
謝謝。
是不是說編譯器自動添加了終止C字符串的null是正確的?C字符串的空終止
因此,在下面的例子:
char * str = "0124";
printf("%x", str[str[3] - str[2] + str[4]]);
輸出總是32?
謝謝。
是,編譯器確實增加空終止。因此有5個字節的內存分配給堆棧。 (str [3] - str [2] + str [4])的計算結果爲(52 - 50 + 0),所以你正在訪問str [2],它將在十六進制中打印0x32。
第一個問題:是
第二個問題,是一個ASCII系統上:您計算'4' - '2' + '\0'
這是在整數:0x34 - 0x32 + 0
= 2,所以你得到str[2]
這是'2'
這是0x32。 '4' - '2'
爲2在C中定義,但如果你的EBCDIC系統上運行的代碼,'2'
是0xf2
FWIW:無論ASCII,EBCDIC或任何其他符合C字符集設置爲數字字符,「4」 - 「2」+「\ 0」都將爲2需要連續。 – chux
終止空字符由編譯器添加; 6.4.5p6:
6 - 在翻譯階段7,字節或零值代碼被附加到從字符串產生字面或文字每個多字節 字符序列。多字節字符 然後用於初始化一個靜態存儲持續時間和長度的數組,只需要包含該序列就足夠了。 [...]
printf
輸出將是系統中2
字符的字符代碼。字符0
至9
保證具有連續的代碼(5.2.1p3),但不具有任何特定的值。
EBCDIC機器上的輸出可能不是32。 –
-1你爲什麼對那個怪誕的'printf'輸出感興趣?這只是分散你的問題,不是嗎?請重新制定。 –
它給了我一個警告「不贊成將字符串常量轉換爲'char *'」。你應該使用char const * str =「0124」 – poorvankBhatia