#include<stdio.h>
int main()
{
char *a;
char *temp ='55515';
a = &temp;
printf("%s ", a);
}
期望的輸出是55515,但實際輸出是5155?爲什麼輸出與第一個字符丟失一起反轉?
#include<stdio.h>
int main()
{
char *a;
char *temp ='55515';
a = &temp;
printf("%s ", a);
}
期望的輸出是55515,但實際輸出是5155?爲什麼輸出與第一個字符丟失一起反轉?
'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,只取決於實現定義的行爲。總而言之,這不是一個嚴格遵守程序所依賴的東西。
''55515'對於字符文字來說太長了,'a =&temp'給'char *'分配了一個'char **','i'沒有被使用,你爲什麼期望這部分內容工作? – Ryan
沒有你的編譯器給你*任何警告*? –
使用'temp =「555515」'和'printf(「%s」,temp);'...... –