【C 语言】结构体 ( 结构体偏移量计算 | 代码示例 )
文章目录
- 一、结构体成员偏移量
- 二、完整代码示例
一、结构体成员偏移量
获取 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 语言】结构体 ( 结构体偏移量计算 | 代码示例 )相关推荐
- 如何用Java做玫瑰花数_c语言如何输出玫瑰花数?(代码示例)
玫瑰花数又称"四叶玫瑰数",是指四位数各位上的数字的四次方之和等于本身的数. 例如:1634就是一个玫瑰花数1*1*1*1=16*6*6*6=12963*3*3*3=814*4*4 ...
- 玫瑰花数java代码_c语言如何输出玫瑰花数?(代码示例)
玫瑰花数又称"四叶玫瑰数",是指四位数各位上的数字的四次方之和等于本身的数,c语言玫瑰花代码是[int main()int i, j, t;for(i=1000; i<100 ...
- c语言isnan,C# Double.IsNaN()用法及代码示例
在C#中,Double.IsNaN()是Double结构方法.此方法用于检查指定的值是否不是数字(NaN). 用法: public static bool IsNaN (double d); 参数: ...
- 【C 语言】文件操作 ( 配置文件读写 | 完整代码示例 ) ★
文章目录 一.头文件 cfg.h 二.核心业务 cfg.c 三.主函数 四.执行结果 一.头文件 cfg.h // 防止多次导入 #ifndef __CFG_H__ #define __CFG_H__ ...
- 【C 语言】结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )
文章目录 一.通过 " . " 操作符操作结构体内存空间 二.通过 " -> " 操作符操作结构体内存空间 三.代码示例 一.通过 " . &q ...
- 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...
- 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
文章目录 一.指针运算 与 指针内存操作 二.结构体偏移量计算 一.指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等 ...
- C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐
文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...
- c语言 结构体ppt,C语言知识学习结构体.ppt
C语言知识学习结构体.ppt Chap 9 结构,9.1 输出平均分最高的学生信息 9.2 学生成绩排序 9.3 修改学生成绩,本章要点,什么是结构结构与数组有什么差别 有几种结构的定义形式,它们之间 ...
最新文章
- 电量模块MODBUS RTU寄存器解读
- FortiAnalyzer-VM 安装使用
- c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...
- python安装后cmd找不到_关于Python3.6环境中,virtualenv找不到命令的解决方法
- 和在c语言,?和:在C语言中的详解
- 诗与远方:无题(三)
- 漫谈忠诚:猪八戒为什么总想离队
- echart同一个dom下多次动态渲染值,防止值、事件重复互相影响
- 手机上做c语言作业的软件下载,手机c语言编程软件
- 基于java的圆通快递单号自动识别api接口代码实例
- cmd命令 从C盘跳到D盘
- 【鸟哥的linux初级笔记——01】
- yolov7 姿态识别-人体骨架-实时检测+实例分割
- Java--捕鱼达人
- 从菜鸟到高手,CMD命令行了解arp欺骗攻击的原理
- 盘点世界上最难的 5 种编程语言!网友看后惊讶道:竟不是C/C++?
- 淘宝以图搜图批量搜1688同款软件
- 汉语言文学自考本科难不难呀?
- 为什么说麻将比围棋难?游戏AI复杂度怎么算
- 《纽约时报》狗急跳墙,蓝翔技校点击率飙升