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

c语言中offseto宏

代码功能概述

((size_t) &((TYPE *)0)->MEMBER) 这行代码是一个经典的宏定义技巧,用于计算结构体 TYPE 中成员 MEMBER 相对于结构体起始地址的偏移量,单位是字节。在标准库中,这个功能被封装为 offsetof 宏。

详细解释

1. (TYPE *)0
  • 这部分代码将整数 0 强制转换为 TYPE * 类型的指针。也就是说,它创建了一个指向地址 0 的 TYPE 类型的指针。在这个操作中,并没有实际访问地址 0,只是利用这个指针来进行后续的计算。
2. ((TYPE *)0)->MEMBER
  • 通过 -> 操作符访问 ((TYPE *)0) 这个指针所指向的结构体中的 MEMBER 成员。由于指针指向的是地址 0,所以这一步并没有真正访问内存,只是从语法上表示访问结构体中的该成员。
3. &((TYPE *)0)->MEMBER

使用取地址运算符 & 获取 ((TYPE *)0)->MEMBER 的地址。因为结构体的起始地址是 0,所以这个地址实际上就是成员 MEMBER 相对于结构体起始地址的偏移量。

4. (size_t)
  • 最后,将得到的地址强制转换为 size_t 类型。size_t 是一种无符号整数类型,通常用于表示对象的大小或地址偏移量,确保结果可以正确地表示偏移量。
#include <stdio.h>
#include <stddef.h>

// 定义一个结构体
typedef struct {
    char a;
    int b;
    double c;
} MyStruct;

int main() {
    // 计算成员相对于结构体起始地址的偏移量
    size_t offset_a = offsetof(MyStruct, a);
    size_t offset_b = offsetof(MyStruct, b);
    size_t offset_c = offsetof(MyStruct, c);

    // 输出偏移量
    printf("Offset of 'a' in MyStruct: %zu bytes\n", offset_a);
    printf("Offset of 'b' in MyStruct: %zu bytes\n", offset_b);
    printf("Offset of 'c' in MyStruct: %zu bytes\n", offset_c);

    return 0;
}

相关文章:

  • 单片机 code RO-data RW-data ZI-data以及OTA学习
  • 在PyTorch中使用插值法来优化卷积神经网络(CNN)所需硬件资源
  • Spring面试题2
  • gitlab 解决双重认证无法登录remote: HTTP Basic: Access denied.
  • webmin配置终端显示样式,模仿UbuntuDesktop终端
  • 25年HVV关于0day的面试题
  • Elasticsearch Open Inference API 增加了对 Jina AI 嵌入和 Rerank 模型的支持
  • 改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(Matlab代码实现)
  • Python爬虫实战:获取笔趣阁小说信息,并做数据分析
  • 科普:你的笔记本电脑中有三个IP:127.0.0.1、无线网 IP 和局域网 IP;两个域名:localhost和host.docker.internal
  • 【Linux】进程优先级
  • 【小白学AI系列】NLP 核心知识点(八)多头自注意力机制
  • js版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性
  • 【什么是双亲委派?】
  • MySQL数据库(3)—— 表操作
  • DeepSeek与ChatGPT:AI语言模型的全面对决与开发者洞察
  • uniapp h5端和app端 使用 turn.js
  • 基于大语言模型的推荐系统(1)
  • 数据库索引:优点、缺点及常见类型
  • 鸿蒙-自定义布局-实现一个可限制行数的-Flex
  • 最高人民法院原副院长唐德华逝世,享年89岁
  • 商务部:长和集团出售港口交易各方不得规避审查
  • 国际奥委会举办研讨会,聚焦如何杜绝操纵比赛
  • 王征、解宁元、牛恺任西安市副市长
  • 当代科技拟召开债券持有人会议 ,对“H20科技2”进行四展
  • 足球少年郎7月试锋芒,明日之星冠军杯构建顶级青少年赛事