2013-07-01 57 views
0

以下代碼:印刷內容給出意想不到的結果

#include <stdio.h> 
#include <stdlib.h> 


typedef struct mytype { 
    int x; int y; int z; 
} mytype; 
int main() 
{ 
    mytype* p = (mytype*)4; 
    void* pp = &(p->x); 
    printf("%d\n",(int)pp); 

} 

打印「4」如預期。

但如果我更改線路:

void* pp = &(p->x); 

要:

void* pp = &(p->y); 

它打印出 「8」。另外,如果我將其更改爲p-> z,則會打印「12」。

這是爲什麼?

+0

恭喜。您已經重新定義了['offsetof'](http://en.wikipedia.org/wiki/Offsetof)宏(附加偏移量爲4)。 – anishsane

+0

雖然我有點好奇。你期待什麼結果? –

回答

3
mytype* p = (mytype*)4; 

聲明一個指針在地址0x04鍵入mytype

void* pp = &(p->x); 
printf("%d\n",(int)pp); 

表明,mytype->x地址是相同的mytype地址。

重複了p->yp->z表明sizeof(int)==4你的平臺上和編譯器插入mytype

偏移量xyz之間的成員之間沒有空白,如果你運行在不同平臺上的代碼可能會改變。

還請注意,我認爲

printf("%d\n",(int)pp); 

依賴未定義行爲,因爲沒有保證sizeof(void*) == sizeof(int)

printf("%p\n",pp); 

應該是安全的。

1

你把你的指針指向4的地址。你的struct(x)的第一個成員將駐留在這裏,所以如果你打印x的內存地址,你就是想讓你的初始起始地點(4)。當你嘗試和打印y時,它開始於8,因爲它的int(和x開始,4並且到8)。與z相同(12開始,16結束,y開始8,結束於12) 。

雖然在那裏沒有結構,但是您將內存轉換到結構中,因此您的指針算術將遵循結構的內存佈局。

相關問題