STM32-C语言结构体地址

定义2个结构体

c 复制代码
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; 

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

c 复制代码
#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位编译器编译,程序输出的结果为

c 复制代码
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博主「知微之见」的原创文章

相关推荐
lingzhilab10 分钟前
零知IDE——基于STM32F103RBT6的PAJ7620U2手势控制WS2812 RGB灯带系统
stm32·单片机·嵌入式硬件
三佛科技-1873661339710 分钟前
BP85956D集成VCC电容电机驱动BUCK电源芯片(12V300mA应用电路)
stm32·单片机·物联网
爱睡觉的王宇昊41 分钟前
PCB设计完全指南:从软件选择到基础规范(通用电路篇详解)
笔记·stm32·单片机·嵌入式硬件·学习
白书宇1 小时前
【STM32实战】从零开始写Linux 0.12内核 第1个实验安装IAR 8.5
linux·c语言·驱动开发·stm32·单片机·嵌入式硬件
意法半导体STM321 小时前
【官方原创】一站式生成STM32N6的ExtMemLoader, FSBL, Appli的点灯工程 LAT1614
人工智能·stm32·单片机·嵌入式硬件·mcu·stm32n6
lengjingzju1 小时前
一网打尽Linux IPC(四):POSIX IPC
linux·服务器·c语言
ShiMetaPi1 小时前
GM-3568JHF丨ARM+FPGA异构开发板系列教程:外设教程 08 串口
stm32·单片机·fpga开发·rk3568
csg11071 小时前
LORA网络的“最后一公里”难题:当信号被重重阻挡,我们有哪些“方法”来增强覆盖?
单片机·嵌入式硬件·物联网·算法
自信150413057592 小时前
数据结构初阶之单链表
c语言·数据结构
m0_555762902 小时前
STM32 CubeMX中FreeRTOS与SysTick配置的深层原因
stm32·单片机·嵌入式硬件·st