文章目录

  • 一、结构体成员偏移量
  • 二、完整代码示例

一、结构体成员偏移量


获取 Student 结构体中 age 成员偏移量 有 222 种写法 ;

  • 结构体样式 :
typedef struct Student
{char name[5];  // 0 ~ 4 字节int age;     // 5 ~ 8 字节char *address; // 9 ~ 12 字节
}Student;
  • 0 内存空间 , 按照 Student 结构体内存类型 进行解析 , 可以求出结构体某个 成员 相对于 0 的偏移量 ;
int offset = (int)&(((Student *)0)->age)
  • 先获取 结构体 成员 , 然后再取该成员的地址 ;
Student student = NULL;
int offset = (int)&(student->age);

上述两种获取 Student 结构体中 age 成员偏移量的方法是等效的 ;

结构体 成员的 偏移量 是可以直接 计算获取的 , 不管有没有实际的 结构体变量 ;

结构体变量 如果声明完成 , 那么结构体中的 成员 的内存 , 就已经分配好了 ;

如果知道了 结构体成员 的内存地址 , 可以根据该 结构体成员 的偏移量 , 计算出该结构体的 首地址 ;

二、完整代码示例


完整代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>/*** @brief The Student struct* 定义 结构体 数据类型 , 同时为该结构体类型声明 别名* 可以直接使用 别名 结构体变量名 声明结构体类型变量* 不需要在前面添加 struct 关键字*/
typedef struct Student
{// 声明变量时 , 会自动分配这 5 字节内存// 赋值时 , 可以直接使用 = 赋值字符串char name[5];  // 0 ~ 4 字节int age;     // 5 ~ 8 字节// 声明变量时 , 只会为 4 字节指针分配内存// 具体的 字符串内存 需要额外使用 malloc 申请内存// 赋值时 , 必须使用 strcpy 函数 , 向堆内存赋值char *address; // 9 ~ 12 字节
}Student;/*** @brief 主函数入口* @return*/
int main()
{// 声明结构体变量Student s1;// 声明结构体指针Student *p = NULL;// 对指针进行算术运算时合法的p = p - 1;p = p + 10;// 给指针 p 设置合法地址p = NULL;// 获取 Student 结构体 age 成员偏移量int age_offset = (int)&(p->age);// 获取 Student 结构体 address 成员偏移量int address_offset = (int)&(((Student *)0)->address);printf("age_offset = %d, address_offset = %d\n", age_offset, address_offset);// 命令行不要退出system("pause");return 0;
}

执行结果 :

age_offset = 8, address_offset = 12
请按任意键继续. . .

【C 语言】结构体 ( 结构体偏移量计算 | 代码示例 )相关推荐

  1. 如何用Java做玫瑰花数_c语言如何输出玫瑰花数?(代码示例)

    玫瑰花数又称"四叶玫瑰数",是指四位数各位上的数字的四次方之和等于本身的数. 例如:1634就是一个玫瑰花数1*1*1*1=16*6*6*6=12963*3*3*3=814*4*4 ...

  2. 玫瑰花数java代码_c语言如何输出玫瑰花数?(代码示例)

    玫瑰花数又称"四叶玫瑰数",是指四位数各位上的数字的四次方之和等于本身的数,c语言玫瑰花代码是[int main()int i, j, t;for(i=1000; i<100 ...

  3. c语言isnan,C# Double.IsNaN()用法及代码示例

    在C#中,Double.IsNaN()是Double结构方法.此方法用于检查指定的值是否不是数字(NaN). 用法: public static bool IsNaN (double d); 参数: ...

  4. 【C 语言】文件操作 ( 配置文件读写 | 完整代码示例 ) ★

    文章目录 一.头文件 cfg.h 二.核心业务 cfg.c 三.主函数 四.执行结果 一.头文件 cfg.h // 防止多次导入 #ifndef __CFG_H__ #define __CFG_H__ ...

  5. 【C 语言】结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )

    文章目录 一.通过 " . " 操作符操作结构体内存空间 二.通过 " -> " 操作符操作结构体内存空间 三.代码示例 一.通过 " . &q ...

  6. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  7. 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )

    文章目录 一.指针运算 与 指针内存操作 二.结构体偏移量计算 一.指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等 ...

  8. C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐

    文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...

  9. c语言 结构体ppt,C语言知识学习结构体.ppt

    C语言知识学习结构体.ppt Chap 9 结构,9.1 输出平均分最高的学生信息 9.2 学生成绩排序 9.3 修改学生成绩,本章要点,什么是结构结构与数组有什么差别 有几种结构的定义形式,它们之间 ...

最新文章

  1. 电量模块MODBUS RTU寄存器解读
  2. FortiAnalyzer-VM 安装使用
  3. c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...
  4. python安装后cmd找不到_关于Python3.6环境中,virtualenv找不到命令的解决方法
  5. 和在c语言,?和:在C语言中的详解
  6. 诗与远方:无题(三)
  7. 漫谈忠诚:猪八戒为什么总想离队
  8. echart同一个dom下多次动态渲染值,防止值、事件重复互相影响
  9. 手机上做c语言作业的软件下载,手机c语言编程软件
  10. 基于java的圆通快递单号自动识别api接口代码实例
  11. cmd命令 从C盘跳到D盘
  12. 【鸟哥的linux初级笔记——01】
  13. yolov7 姿态识别-人体骨架-实时检测+实例分割
  14. Java--捕鱼达人
  15. 从菜鸟到高手,CMD命令行了解arp欺骗攻击的原理
  16. 盘点世界上最难的 5 种编程语言!网友看后惊讶道:竟不是C/C++?
  17. 淘宝以图搜图批量搜1688同款软件
  18. 汉语言文学自考本科难不难呀?
  19. 为什么说麻将比围棋难?游戏AI复杂度怎么算
  20. 《纽约时报》狗急跳墙,蓝翔技校点击率飙升

热门文章

  1. 扩展KMP --- HDU 3613 Best Reward
  2. 为什么工作时间长了。技术反而变低了。
  3. 【博客话题】我的2011项目总结
  4. 集群、分布式、负载均衡区别
  5. requests与urllib.request
  6. listalias - 列出用户和系统别名
  7. 计算一个二进制数中数字“1”的个数(位运算)
  8. Unity Editor已停止工作
  9. linux 三大利器 grep sed awk sed
  10. chgrp 简明笔记