我是C语言的新手,只是了解结构和指针。

我的问题与我最近看到的offsetof宏有关。我知道它是如何工作的以及其背后的逻辑。

<stddef.h>文件中,定义如下:

#define offsetof(type,member) ((unsigned long) &(((type*)0)->member))

我的问题是,如果我有一个如下所示的结构:
struct test {
    int field1:
    int field2:
};

struct test var;

为什么我不能直接获得field2的地址为:
char * p = (char *)&var;
char *addressofField2 = p + sizeof(int);

而不是写这样的东西
field2Offset = offsetof (struct test, field2);

然后将偏移值添加到var的起始地址?

有什么区别吗?使用offsetof更有效吗?

最佳答案

C编译器通常会在struct的成员之间添加额外的填充位或字节,以提高效率并保持整数字对齐(在某些体系结构中需要避免bus errors,而在某些体系结构中则需要避免效率问题)。例如,在许多编译器中,如果您具有以下struct:

struct ImLikelyPadded {
    int x;
    char y;
    int z;
};

您可能会发现sizeof(struct ImLikelyPadded)是12,而不是9,因为编译器将在一个字节的char y的末尾与字长的int z之间插入三个额外的填充字节。这就是offsetof如此有用的原因-它使您可以确定在哪些地方真正将填充字节作为因素,并且高度可移植。

关于c - 为什么需要offsetof宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35259189/

10-10 09:58