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

C语言进阶习题【3】(7预处理)——写一个宏计算结构体变量相对于首地址的偏移

1. 题目描述

写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明

2. 思路

先调用库函数,offsetof,看下我们的结果,然后分析。
在这里插入图片描述
char c1 是1字节 —VS默认是8 二者取小。即取1 ,所以 c1放在右边灰色格子里,占1个字节
int i 是4字节—VS默认是8 二者取小。即取4,存放在4的整数倍,所以放在4位置棕色格子占4个字节
char c2 是1字节—VS默认是8 二者取小。即取1,存放在1的整数倍位置,所以紧跟着int后面存在8位置,占1个字节

结构体整体大小,看结构体成员对齐最大的整数倍,结构体成员最大是4 所以结构体大小是4的整数倍,现在刚好是在8第9个位置,不是4的整数倍,所以要往后再数3个位置,11位置,结构体的大小是12。

  1. 先将0转换为一个结构体类型的指针,相当于某个结构体的首地址是0。此时,每一个成员的偏移量就成了相对0的偏移量,这样就不需要减去首地址了。

  2. 对该指针用->访问其成员,并取出地址,由于结构体起始地址为0,此时成员偏移量直接相当于对0的偏移量,所以得到的值直接就是对首地址的偏移量。

  3. 取出该成员的地址,强转成size_t并打印,就求出了这个偏移量。

3. 代码实现

#include<stddef.h>
struct S
{
	char c1;
	int i;
	char c2;
}s;

#define OFFSET(type, member)  (size_t)&((type*)0)->member
int main()
{
	printf("%d ", offsetof(struct S, c1));
	printf("%d\n", OFFSET(struct S, c1));

	printf("%d ", offsetof(struct S, i));
	printf("%d\n", OFFSET(struct S, i));

	printf("%d ", offsetof(struct S, c2));
	printf("%d\n", OFFSET(struct S, c2));

	return 0;
}

在这里插入图片描述

相关文章:

  • 先进制造aps专题三十 用免费生产排程软件isuperaps进行长期生产计划制定
  • 计算机图形学:实验环境配置
  • 基于Matlab实现串口实时显示波形GUI界面(源码)
  • Linux 驱动入门(6)—— IRDA(红外遥控模块)驱动
  • 代码随想录算法训练营day40(补0208)
  • “死”循环(查漏补缺)
  • 055 SpringCache
  • cs106x-lecture14(Autumn 2017)-SPL实现
  • 【Java进阶学习 第五篇】JDK8、9中的接口新特性
  • ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用
  • 第五章:工程化实践 - 第三节 - Tailwind CSS 大型项目最佳实践
  • kafka+spring cloud stream 发送接收消息
  • 华为OD机试真题-相对开音节-OD统一考试(E卷)
  • Meterpreter之getsystem命令提权原理详解
  • Zotero 快速参考文献导出(特定期刊引用)
  • 区块链相关方法-波士顿矩阵 (BCG Matrix)
  • Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现
  • 在LangFlow中集成OpenAI Compatible API类型的大语言模型
  • 不同类型的网站选择不同的服务器,那么应该怎么选择服务器呢?
  • STM32-心知天气项目
  • 就规范涉企行政执法专项行动有关问题,司法部发布解答
  • 云南德宏州盈江县发生4.5级地震,震源深度10千米
  • 国防部:中方愿与俄方不断增强两军关系良好发展势头
  • 人民日报访巴西总统卢拉:“巴中关系正处于历史最好时期”
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线
  • 全国层面首次!《防震减灾基本知识与技能大纲》发布