的代碼如下:什麼`結果爲int *
int main(void) {
char* str = "12345678";
int* in = (int*)str;
printf("%d\n%d\n", in[0], in[1]);
return 0;
}
是什麼結果呢?爲什麼?
的代碼如下:什麼`結果爲int *
int main(void) {
char* str = "12345678";
int* in = (int*)str;
printf("%d\n%d\n", in[0], in[1]);
return 0;
}
是什麼結果呢?爲什麼?
結果是什麼?
實現定義。
爲什麼?
因爲標準是這樣說的。
§5.2.10.7
一個目的指針可以被明確地轉換成不同類型的對象的指針。當一個 對象指針類型的prvalue v被轉換爲對象指針類型「指向cv T的指針」時,結果爲static_cast(static_cast(v))。將「指針指向T1」類型的prvalue轉換爲類型「指向 T2」的指針(其中T1和T2是對象類型,其中T2的對齊要求不比 更嚴格,並返回到T1的原始類型)原始指針值。
順便說一句,這是違法的C++:char* str = "12345678";
由於字符串文字是常量。是正確的應該是:const char* str = "12345678";
你爲什麼認爲它是實現定義的?我很確定,通過指向int的指針訪問char數組是UB(不僅僅是實現定義)。首先,陣列可能不適合對齊。 –
@MartinBonner它是一個來自char指針的顯式reinterpret_cast。這是合法的。結果留給實施,但它不是UB。 –
@RichardHodges只有當您引用''char *'指向的原始數據爲int – PeterT
結果是未定義的行爲,其n4296(的C++ 14最後草案)定義爲
行爲指此國際標準並沒有規定要求
任何東西都可能發生。 Seg故障,硬盤擦除等等。一個相當可信的結果是,ASCII字符「1234」被當作一個四字節小端字節的字節,並且打印出來的結果數字(類似於「5678」) - 但不要依賴這個。
答案是(我的系統)
875770417
943142453
這裏去的原因: STR分, 「12345678」。在我的系統中,int是4個字節。所以*指向「1234」,* in + 1指向「5678」。 內存char以二進制形式存儲。
現在我們來看看[0]。在[0]中將評估「1234」。在內存中的表示。將這個(二進制):
00110001 00110010 00110011 00110100
(這些是ASCII值1,這是2,3,4 - 49,50,51,52)
現在你有將char分配給int,現在編譯器將加載大約32位作爲一個字。取決於BIG ENDIAN或LITTLE ENDIAN評估將發生。我的系統是LITTLE ENDIAN。 所以我的評價發生了這樣 -
52*(2^24) + 51*(2^16) + 50*(2^8) + 49 = 8775770417
類似的解釋爲[1]。希望這可以清除事情。
由於硬件,而不是你使用的操作系統 –
實際上,Ubuntu 16.04在big-endian(powerpc)和little-endian(其他所有)架構上都可以運行 –
@Colin__s:除了某些*硬件是可切換的,然後操作系統可以選擇 –
您認爲結果是什麼?爲什麼?什麼是你正試圖解決的「實際問題」?你是否知道自2011年以來你的'str'初始化是非法的?我打電話給警察哈哈。嚴肅地說,這聽起來像是一個沒有任何研究工作的parroted作業問題,所以我有興趣在我考慮回答之前聽到更多關於你的信息。祝你好運! –
將'printf()'中的格式從'%d'更改爲'%x',這可能會讓您知道發生了什麼。 – shrike
@IT_CZL:請檢查您是否滿意答案。 – adisticated