2017-07-28 54 views
-8
#include<stdio.h> 
int main() 
{ 
    char *a; 
    char *temp ='55515'; 
    a = &temp; 
    printf("%s ", a); 
} 

期望的輸出是55515,但實際輸出是5155?爲什麼輸出與第一個字符丟失一起反轉?

+6

''55515'對於字符文字來說太長了,'a =&temp'給'char *'分配了一個'char **','i'沒有被使用,你爲什麼期望這部分內容工作? – Ryan

+8

沒有你的編譯器給你*任何警告*? –

+0

使用'temp =「555515」'和'printf(「%s」,temp);'...... –

回答

1

'55515'是一個多字符常量,轉換爲int。您的平臺具有32位int s,所以MSB字節被丟棄,並且得到的int(int)0x35353135。然後以實現定義的方式將其轉換爲指向char的指針。您的平臺是一個小端平臺,並且char轉換保留了int值。指針對象的現在在內存佈局爲

temp: 
| 0x35 | 0x31 | 0x35 | 0x35 

| 0x35 | 0x31 | 0x35 | 0x35 

它不能扣除您是否正在使用64位或32位平臺。 你現在讓另一個指針char *指向指針對象的第一個字節,即字節0x35,然後printf這與%s字符串。

根據你的平臺,printf調用只有實現定義的行爲或者也可能是未定義的行爲 - 它取決於你的指針是32位還是64位寬 - 如果是32,那麼你有未定義的行爲,如果是64,只取決於實現定義的行爲。總而言之,這不是一個嚴格遵守程序所依賴的東西。

+0

以上回答是正確的,但是請注意,嚴重的編譯器會發出警告,或者TWO: – ingconti

+0

添加代碼示例 – ingconti

相關問題