2016-09-27 103 views
0

的代碼如下:什麼`結果爲int *

int main(void) { 
    char* str = "12345678"; 
    int* in = (int*)str; 
    printf("%d\n%d\n", in[0], in[1]); 
    return 0; 
} 

是什麼結果呢?爲什麼?

+12

您認爲結果是什麼?爲什麼?什麼是你正試圖解決的「實際問題」?你是否知道自2011年以來你的'str'初始化是非法的?我打電話給警察哈哈。嚴肅地說,這聽起來像是一個沒有任何研究工作的parroted作業問題,所以我有興趣在我考慮回答之前聽到更多關於你的信息。祝你好運! –

+0

將'printf()'中的格式從'%d'更改爲'%x',這可能會讓您知道發生了什麼。 – shrike

+0

@IT_CZL:請檢查您是否滿意答案。 – adisticated

回答

1

結果是什麼?

實現定義。

爲什麼?

因爲標準是這樣說的。

§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";

+1

你爲什麼認爲它是實現定義的?我很確定,通過指向int的指針訪問char數組是UB(不僅僅是實現定義)。首先,陣列可能不適合對齊。 –

+0

@MartinBonner它是一個來自char指針的顯式reinterpret_cast。這是合法的。結果留給實施,但它不是UB。 –

+0

@RichardHodges只有當您引用''char *'指向的原始數據爲int – PeterT

0

結果是未定義的行爲,其n4296(的C++ 14最後草案)定義爲

行爲指此國際標準並沒有規定要求

任何東西都可能發生。 Seg故障,硬盤擦除等等。一個相當可信的結果是,ASCII字符「1234」被當作一個四字節小端字節的字節,並且打印出來的結果數字(類似於「5678」) - 但不要依賴這個。

1

答案是(我的系統)

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]。希望這可以清除事情。

+1

由於硬件,而不是你使用的操作系統 –

+0

實際上,Ubuntu 16.04在big-endian(powerpc)和little-endian(其他所有)架構上都可以運行 –

+1

@Colin__s:除了某些*硬件是可切換的,然後操作系統可以選擇 –