当前位置: 首页 > news >正文

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; 

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

#include <stdio.h>
#include <malloc.h>
#include <string.h>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.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博主「知微之见」的原创文章

http://www.lryc.cn/news/191532.html

相关文章:

  • Go HTTP 调用(下)
  • mysql5.7获取json数组中的某个对象
  • PTE考试解析
  • UE4和C++ 开发-UE4怎么删除C++类
  • 基于图像识别的迁移学习之一
  • k8s使用
  • HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)
  • jwttoken+redis+springsecurity
  • asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • 十六、【橡皮擦工具组】
  • BAT学习——计算当前路径下指定格式文件的MD5值,将文件名与MD5值写入文本
  • 排序算法(stable_sort(), sort())
  • 【atoi函数详解】
  • 字符串左旋 与 字符串旋转结果
  • 真人现在猫鼠躲猫猫游戏搭建流程:专业思考与深度思考
  • 计算机导论实验——Linux基础入门
  • 服务运营 |摘要:学术+业界-近期前沿运筹医疗合作精选
  • 基于Dockerfile创建镜像
  • 架构实战关键知识点
  • M1Mac开启x86_64命令行archlinux虚拟机的最佳实践(qemu)
  • 深度神经网络压缩与加速技术
  • 系统架构设计:11 论湖仓一体架构及其应用
  • Linux系统编程_文件编程第1天:打开、写入、读取、关闭文件等编程
  • scapy构造ND报文
  • c++设计模式之单例设计模式
  • App自动化测试环境搭建
  • win10搭建gtest测试环境+vs2019
  • 【代码随想录】算法训练营 第二天 第一章 数组 Part 2
  • 在深度学习中,累计不同批次的损失估计总体损失
  • 论文导读|八月下旬Operations Research文章精选:定价问题专题