• STM32-C语言结构体地址


    定义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; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    写程序来验证下,结构体本身的地址,以及它包含的成员的地址,有什么样的联系。

    #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; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    采用windows的64位编译器编译,程序输出的结果为

    person结构体的地址 = 0x1f1420
    person->pprenode的地址 = 0x1f1420
    person->pnextnode的地址 = 0x1f1428
    person->member_num的地址 = 0x1f1430
    person->age的地址 = 0x1f1434
    person->addr的地址 = 0x1f1436
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们来分析一下为什么是这样的结果:

    1.结构体指针person的地址,与它指向的结构体的第一个成员(person->pprenode)地址是一样的,都是0x1f1420

    2.pprenodepnextnode都是指针变量,由于指针变量在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博主「知微之见」的原创文章

  • 相关阅读:
    java计算机毕业设计ssm+jsp计算机视频学习网站
    面试高潮季来临,Android 程序猿该如何斩获大厂offer?
    人形机器人:未来与现实的交汇
    2022年11月27日学习 SVM
    FPGA实战小项目3
    不到2000字,轻松带你搞懂STM32中GPIO的8种工作模式
    【Linux】CentOS 7安装 MySQL
    工业RFID设备如何实现抗干扰功能?
    25道Python经典面试题大全,看这一篇就够了
    有意思的方向裁切 overflow: clip
  • 原文地址:https://blog.csdn.net/qq_21794157/article/details/133805645