- 論壇徽章:
- 0
|
#include <stdio.h>
struct dd
{
char ee[20];
char ff[20];
};
struct aa
{
char bb[20];
char cc[20];
struct dd *point;
};
int func( struct aa *p )
{
strcpy( p->bb, "aaaaaaaaa" );
strcpy( p->cc, "bbbbbbbb" );
p->point = (struct dd *)malloc(sizeof( struct dd ));
strcpy( p->point->ee, "eeeeeeee" );
strcpy( p->point->ff, "ffffffff" );
return 0;
}
int main()
{
struct aa saa;
memset( saa, 0x00, sizeof( struct aa ) );
func( &saa );
printf( "%x|%x\n", (char *)&saa+40, &saa.point );
printf( "%x|%x\n", *(((char *)&saa+40)),*(&(saa.point)) );
free( saa.point );
return 0;
}
執(zhí)行結(jié)果:
2ff21658|2ff21658
20|200008a8
紅色字體第一句printf是用分別用內(nèi)存隱射和直接去結(jié)構(gòu)元素地址的方式來打印point的指針的地址,這句打出來肯定2種方式都是一樣的。
對于第二句printf,我取point指針的內(nèi)容,按我的想象應(yīng)該打出來是一樣的啊,這2種方式實際都是指向結(jié)構(gòu)dd,所以取point的內(nèi)容就應(yīng)該是存放的dd的地址,也應(yīng)該是一樣的,但是實踐的結(jié)果不一樣,第一個%x沒打這個地址來,第二個%x打出了正確的地址來,這是為什么?(這個問題其實也知道答案了,但是還是想大蝦解釋清楚些)
另外:我如果把第二個printf改成printf( "%x|%x\n", *((struct dd *)((char *)&saa+40)),*(&(saa.point)) ),這樣結(jié)果第一個%x打出來正確的地址,第二個%x打出來的是deadbeef。這又是為什么?
執(zhí)行結(jié)果:
2ff21658|2ff21658
200008a8|deadbeef |
|