文章目录
一、结构体成员偏移量
二、完整代码示例
一、结构体成员偏移量
获取 Student 结构体中 age 成员偏移量 有 2 22 种写法 ;
结构体样式 : 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; }
执行结果 :