c - 为什么这个 offsetof() 的实现有效?

标签 c pointers offsetof

在 ANSI C 中,offsetof 定义如下。

#define offsetof(st, m) \
    ((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))

既然我们解引用了一个 NULL 指针,为什么这不会引发段错误?或者这是某种编译器 hack,它看到只有偏移量的地址被取出,所以它静态计算地址而不实际取消引用它?此代码是否可移植?

最佳答案

以上代码中的任何一点都没有取消引用。当 *-> 用于地址值以查找引用值时,就会发生取消引用。上面 * 的唯一用途是在用于转换目的的类型声明中。

上面使用了 -> 运算符,但它不用于访问值。相反,它用于获取值的地址。这是一个非宏代码示例,应该使它更清晰一些

SomeType *pSomeType = GetTheValue();
int* pMember = &(pSomeType->SomeIntMember);

第二行实际上并没有导致取消引用(依赖于实现)。它只是在 pSomeType 值内返回 SomeIntMember 的地址。

您看到的是任意类型和 char 指针之间的大量转换。 char 的原因是它是 C89 标准中唯一(可能是唯一)类型之一,它具有明确的大小。大小为 1。通过确保大小为 1,上面的代码可以执行计算值的真实偏移量的邪恶魔法。

关于c - 为什么这个 offsetof() 的实现有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/713963/

相关文章:

c - C中如何根据奇数或偶数改变两个线程的执行顺序?

c - 为什么同一个程序的 c 和 fortran 版本会产生不同的结果?

c - 列表程序中不兼容指针类型的赋值

c++ - 声明一个二维指针对象数组

c - 通过定义明确的 offsetof 访问成员吗?

C++类成员变量知道自己的偏移量

编译C文件,运行它并使用CMAKE写入头文件

css - 如何使用 CSS 设置 GtkLabel 的样式?

c - 由于数组会退化为指针,为什么我不能应用 const?

c - 为什么非常量 offsetof 表达式有效?