【C 语言】结构体 ( 结构体偏移量计算 | 代码示例 )
【摘要】
文章目录
一、结构体成员偏移量二、完整代码示例
一、结构体成员偏移量
获取 Student 结构体中 age 成员偏移量 有
...
一、结构体成员偏移量
获取 Student
结构体中 age
成员偏移量 有 2 2 2 种写法 ;
- 结构体样式 :
typedef struct Student
{
char name[5]; // 0 ~ 4 字节
int age; // 5 ~ 8 字节
char *address; // 9 ~ 12 字节
}Student;
- 1
- 2
- 3
- 4
- 5
- 6
- 将
0
内存空间 , 按照Student
结构体内存类型 进行解析 , 可以求出结构体某个 成员 相对于 0 的偏移量 ;
int offset = (int)&(((Student *)0)->age)
- 1
- 先获取 结构体 成员 , 然后再取该成员的地址 ;
Student student = NULL;
int offset = (int)&(student->age);
- 1
- 2
上述两种获取 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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
执行结果 :
age_offset = 8, address_offset = 12
请按任意键继续. . .
- 1
- 2
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/121688646
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)