为什么offsetof宏是必要的?

我是C语言的新手,刚刚学习了结构和指针.

我的问题与我最近看到的偏移宏有关.我知道它的工作原理和背后的逻辑.

在< 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编译器通常会在结构的成员之间添加额外的填充位或字节,以便提高效率并保持整数字对齐(在某些体系结构中需要避免 bus errors,并且在某些体系结构中需要避免效率问题).例如,在许多编译器中,如果你有这个结构:
struct ImLikelyPadded {
    int x;
    char y;
    int z;
};

你可能会发现sizeof(struct ImLikelyPadded)是12而不是9,因为编译器会在单字节char y的末尾和字大小的int z之间插入三个额外的填充字节.这就是offsetof如此有用的原因 – 它可以让你确定事实上甚至是填充字节的因素,并且具有高度的可移植性.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...