关于c语言结构体偏移的一点思考(二)

简介: 关于c语言结构体偏移的一点思考(二)

1 问题定义

已知结构体类型定义如下:

struct node_t{

   char a;

   int b;

   int c;

};

int *p_c,该指针指向struct node_t node的成员变量c

结构体1Byte对齐

#pragma pack(1)

求:结构体变量 node的成员变量b的值?

拿到这个问题的时候,我们先做一下简单的分析,题目的意思是根据一个指向某结构体成员变量的指针,求该结构体的另外一个成员变量的值。

2 解决方案

那么可能的几种解法有:

解法一

由于我们知道结构体是1Byte对齐的,所以这道题最简单的解法是:

*(int *)((unsigned long)p_c - sizeof(int))

成员变量c的地址减去sizeof(int)从而得到成员变量b的地址,然后再强制转换为int *,最后再取值最终得到成员变量b的值;

解法二

上述代码虽然简单,但扩展性不够好。我们希望通过p_c直接得到指向该结构体的指针

p_node,然后通过p_node访问该结构体的任意成员变量了。

由此我们得到计算结构体起始地址p_node的思路为:

【成员变量c的地址p_c】减去【c在结构体中的偏移】

通过上一篇的介绍我们得到结构体struct node_t中成员变量c的偏移为:

(unsigned long)&(((struct node_t *)0)->c)

所以我们得到结构体的起始地址指针p_node为:

(struct node_t *)((unsigned long)p_c - (unsigned long)(&((struct node_t *)0)->c))

最后我们就可以使用下面的代码来获取成员变量a,b的值:

p_node->a

p_node->b

3 总结

在已知结构体某一个成员变量的地址的前提下,可以通过第一讲介绍的技巧,快速获得结构体的起始位置,最终可以得到任意一个变量的地址。


目录
相关文章
|
15天前
|
程序员 C语言
【C语言】初步认识结构体
【C语言】初步认识结构体
15 0
|
1月前
|
C语言
C语言结构体内存对齐
C语言结构体内存对齐
|
1天前
|
存储 编译器 程序员
C语言:自定义类型 - 结构体 & 联合体 & 枚举
C语言:自定义类型 - 结构体 & 联合体 & 枚举
9 2
|
5天前
|
存储 编译器 C语言
[C语言]自定义类型(结构体~枚举~联合体)
[C语言]自定义类型(结构体~枚举~联合体)
|
10天前
|
存储 算法 程序员
【C言专栏】C 语言结构体的应用与实践
【4月更文挑战第30天】C语言中的结构体是自定义数据类型的关键,它组合不同类型的數據以创建新类型,尤其适合处理复杂对象如学生信息。通过定义结构体如`struct Student`,包含名字、学号和成绩,可以方便地实例化和访问成员。结构体在链表实现、函数参数传递和数组中都有广泛应用,如表示链表节点和处理批量数据。理解并熟练运用结构体对于C语言编程至关重要,能提升代码效率和可读性。
|
16天前
|
编译器 Linux C语言
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
|
17天前
|
存储 C语言
C语言中定义结构体类型变量的深入探索
C语言中定义结构体类型变量的深入探索
8 0
|
25天前
|
存储 C语言
结构体(C语言)
结构体(C语言)
|
1月前
|
存储 C语言
C语言自定义类型结构体详解
在C语言中,结构体是复合数据类型,能组合不同类型的数据显示。定义结构体用`struct`关键字,如`struct Student {char name[20]; int age; float score;};`。声明结构体变量如`struct Student stu1;`,访问成员用`.`操作符,如`stu1.age = 20;`。初始化可直接赋值`struct Student stu1 = {"李四", 22, 85.5};`。结构体数组如`struct Student stuArray[3]`,结构体指针如`struct Student *pStu = &stu1;`。
7 0
|
1月前
|
存储 安全 网络协议
自定义类型-结构体,联合体和枚举-C语言
自定义类型-结构体,联合体和枚举-C语言