定义2个结构体
typedef struct _demo_node_{ //结构体本身的地址
struct _demo_node_* pprenode; //实际地址开始的位置,最下面的输出结果可以看出
struct _demo_node_* pnextnode;
unsigned long member_num;
unsigned short age;
char addr[0]; //位置末尾
}demo_node;
typedef struct {
char province[8];
char city[8];
}address_info;
写程序来验证下,结构体本身的地址,以及它包含的成员的地址,有什么样的联系。
#include
#include
#include
typedef struct _demo_node_{
struct _demo_node_* pprenode;
struct _demo_node_* pnextnode;
unsigned long member_num;
unsigned short age;
char addr[0];
}demo_node;
typedef struct {
char province[8];
char city[8];
}address_info;
int main(void)
{
demo_node* person = NULL;
person = (demo_node*)malloc(sizeof(demo_node)+sizeof(address_info));
if(NULL == person)
{
printf("malloc demo_node failed\n\r");
return -1;
}
printf("person结构体的地址 = 0x%0x\n",person);
printf("person->pprenode的地址 = 0x%0x\n",&(person->pprenode));
printf("person->pnextnode的地址 = 0x%0x\n", &(person->pnextnode));
printf("person->member_num的地址 = 0x%0x\n", &(person->member_num));
printf("person->age的地址 = 0x%0x\n", &(person->age));
printf("person->addr的地址 = 0x%0x\n", &(person->addr));
free(person);
return 0;
}
采用windows的64位编译器编译,程序输出的结果为
person结构体的地址 = 0x1f1420
person->pprenode的地址 = 0x1f1420
person->pnextnode的地址 = 0x1f1428
person->member_num的地址 = 0x1f1430
person->age的地址 = 0x1f1434
person->addr的地址 = 0x1f1436
我们来分析一下为什么是这样的结果:
1.结构体指针person的地址,与它指向的结构体的第一个成员(person->pprenode)地址是一样的,都是0x1f1420
2.pprenode和pnextnode都是指针变量,由于指针变量在64位机器中占8个字节,所以
person->pnextnode的地址 = 8 + person->pprenode的地址 = 0x1f1428
person->member_num的地址 = 8 + person->pnextnode的地址 = 0x1f1430
3.member_num是unsigned long类型的变量,在windows的64位机器中占4个字节,所以person->age的地址 = 4 + person->member_num的地址 = 0x1f1434
4.age是unsigned short类型的变量,可以等同于short占用的字节,都是2,所以person->addr的地址 = 2 + person->age的地址 = 0x1f1436
关于结构体成员地址,就简单介绍到这里了!
细心的同学一定发现了demo_node 结构体中char addr[0] 这个成员,这其实是个占位符。
版权声明:本文为CSDN博主「知微之见」的原创文章