C语言offsetof宏的使用与模拟实现

news/2025/1/12 7:55:24/

⭐️ 往期文章

✨链接1:C语言文件打开关闭详解、文件顺序读写详解。
✨链接2:C语言文件随机读写详解(fseek、ftell、rewind)。
✨链接3:C语言scanf/fscanf/sscnaf和printf/fprintf/sprintf的区别。
✨链接4:C语言打开文件一次既可以读又可以写。
✨链接5:C语言文件结束的判定(feof、ferror)。
✨链接6:宏和函数的区别详解。
✨链接7:C语言结构体计算大小结构体的对齐数,修改默认对齐数。


⭐️ offsetof

💬 宏原型:

size_t offsetof( structName, memberName );
  • structName 结构体类型
  • memberName 结构体成员名字
  • size_t offsetof 返回一个 size_t 数,size_t是无符号数

💬 宏作用: 计算结构体成员相对于结构体类型的偏移量。

💬 宏头文件:#include <stddef.h>

⭕️ 宏的使用

#include <stddef.h>
#include <stdio.h>struct S {int a;char c;double d;
};int main() {printf("%d\n" , offsetof(struct S , a));printf("%d\n" , offsetof(struct S, c));printf("%d\n" , offsetof(struct S, d));return 0;
}

在这里插入图片描述


⭕️ 宏的模拟实现

#define OFFSETOF(struct_type , name)    ((size_t)&(((struct_type*)0)->name))

解析:
在这里插入图片描述
第一步把 0 转换为当前结构体类型的地址,在使用 -> 取到这个结构体的的成员。因为 0 已经是当前结构体类型的起始地址,所以结构体成员相对于结构体的偏移量就是当前成员的地址。在 & 之后强制类型转换为 size_t 类型。


✨学习结构体计算大小:C语言结构体计算大小结构体的对齐数,修改默认对齐数。


http://www.ppmy.cn/news/628662.html

相关文章

SQL专家云快速解决阻塞

背景 当数据库突然产生严重阻塞时&#xff0c;运维人员要快速找到阻塞的源头并处理&#xff0c;让业务快速恢复。但是大多数运维人员只掌握了sp_who2、sp_lock等简单的语句&#xff0c;存在以下不足&#xff1a; 找不到真正的源头&#xff0c;过程中会误杀掉大量的会话&#xf…

The argument for the named parameter ‘child‘ was already specified. Try removing one of the named ..

问题描述&#xff1a;运行Flutter示例代码提示报错为&#xff1a; The argument for the named parameter child was already specified. Try removing one of the named arguments,or correcting one of the names to reference a different named parameter. 已指定命名参数…

ECC --- Error Correcting Code,错误检查和纠正

ECC是“Error Correcting Code”的简写&#xff0c;中文名称是“错误检查和纠正”。ECC是一种能够实现“错误检查和纠正”的技术&#xff0c;ECC内存就是应用了这种技术的内存&#xff0c;一般多应用在服务器及图形工作站上&#xff0c;这将使整个电脑系统在工作时更趋于安全稳…

correction

int main() {int a=1,b=2,m=0,n=0,k;k=(n=b<a)

Chapter12 TCP:The Transmission Protocol(Preliminaries)

文章目录 12 TCP: The Transmission Protocol(Preliminaries)12.1 Introduction12.1.1 ARQ and Retransmission12.1.2 Windows of Packets and Sliding Windows12.1.3 Variable Windows: Flow Control and Congestion Control12.1.4 Setting the Retransmission Timeout 12.2 I…

ROS+Gazebo中红绿黄交通灯如何实现?

红灯&#xff1a; 绿灯&#xff1a; 黄灯&#xff1a; 交通灯车道识别&#xff0c;是最简单的自动驾驶仿真。 参考代码如下&#xff1a; #include "GazeboTrafficLight.hpp"namespace gazebo {GazeboTrafficLight::GazeboTrafficLight() {sequence_timestamp_ 0.0;…

idea 用maven打包报错:After correcting the problems, you can resume the build with the command

问题大概&#xff1a; IDEA After correcting the problems, you can resume the build with the command解决方案“ 之前使用的是USE JAVA_HOME,修改成项目的就可以成功build project了。

error: expected declaration specifiers or ‘...’ before numeric constant

今天遇到了这个错误&#xff0c;很奇怪&#xff0c;最终解决了。 可以产生这个错误的示例代码如下&#xff1a; #include <stdio.h>#define VALUE 1int func(int a) {printf("%d\n",a);return 0; }int main() {int func(VALUE);return 0; }编译&#xff1a; …