- 论坛徽章:
- 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;
}
执行结果:
2ff21658|2ff21658
20|200008a8
红色字体第一句printf是用分别用内存隐射和直接去结构元素地址的方式来打印point的指针的地址,这句打出来肯定2种方式都是一样的。
对于第二句printf,我取point指针的内容,按我的想象应该打出来是一样的啊,这2种方式实际都是指向结构dd,所以取point的内容就应该是存放的dd的地址,也应该是一样的,但是实践的结果不一样,第一个%x没打这个地址来,第二个%x打出了正确的地址来,这是为什么?(这个问题其实也知道答案了,但是还是想大虾解释清楚些)
另外:我如果把第二个printf改成printf( "%x|%x\n", *((struct dd *)((char *)&saa+40)),*(&(saa.point)) ),这样结果第一个%x打出来正确的地址,第二个%x打出来的是deadbeef。这又是为什么?
执行结果:
2ff21658|2ff21658
200008a8|deadbeef |
|