2017-10-21 216 views
0

我期待設置一個表達式的結果(這是一個int)轉換成一個int指針。如果我按照以下步驟操作:關於複製表達值的查詢的指針使用的memcpy

int* a = new int; 
memcpy(a, (int*)(3+4), sizeof(int)); 

我在繞行它的預期行爲時遇到了麻煩。將它的值7複製到一個預期的。還是會導致一些不確定的行爲

+2

這似乎不大可能,有一個在內存地址'7'有效的'int'值。 「(int *)(3 + 4)'是無稽之談;此代碼展示未定義的行爲。使它成爲'* a = 3 + 4;' –

+2

地址'0x0000007'在* system reserved *內存範圍內下降。誰知道你會得到什麼價值(除了分段錯誤)。你爲什麼將C++分配與'new'和C'memcopy'混合? –

回答

3

不,這不會在那裏複製值7。相反,你會得到未定義的行爲。

認爲寫作memcpy(dest, source, size)的意思是「請轉到由source指定的存儲器地址,並從中複製size個字節。如果你寫(int *)(3 + 4),你會得到一個指針,其數值爲七,意味着它指向的內存地址7.正如你不會指望一個塊的房子137名爲先生和夫人137人有人居住,你不應該期望的內存地址7的內容是數值7

事實上,內存地址7不可能甚至是存儲您可以閱讀或寫字。你本質上是用類型轉換「編造」了一個地址,沒有理由相信這裏有任何意義。想象一下,在信件上寫下虛假的郵寄地址並將其放入郵件中。它實際上到達任何人的可能性都很小,如果它到達他們,他們不知道你爲什麼要聯繫他們。

從語言的角度來看,這是不確定的行爲,並且在大多數系統,它會出現段錯誤。