【发布时间】:2016-02-15 10:28:25
【问题描述】:
挂在geeksforgeeks上关于位域,找到了这个例子:
#include <stdio.h>
struct test {
unsigned int x;
long int y : 33;
unsigned int z;
};
int main() {
struct test t;
unsigned int *ptr1 = &t.x;
unsigned int *ptr2 = &t.z;
printf("%d", ptr2 - ptr1);
return 0;
}
结果,输出为 4。但为什么呢? x占4个字节,y-8,z-4。x和z的地址差一定是8?
【问题讨论】:
-
两个指针之间的差异不以字节为单位,而是以指针指向的任何类型。此外,
type与最对齐成员的对齐方式(可能是long int)和&test.x == &test对齐,所以如果sizeof(unsigned) != sizeof(long int),test.x和test.y之间存在对齐间隙(填充),如果实现甚至接受long int类型的位域。 -
我在每篇文章中不断听到这个“geekforgeeks”,其中包含糟糕的、指定不当的行为、无意义的代码。我真的认为你应该避开那个网站,他们似乎不太了解他们在说什么。
-
Lundin:也许我可以同意,我几天前才发现它……但无论如何,这个棘手的“真空中的球形马”示例让我很苦恼:)
-
@artsin 正确的说法是球形牛。
-
@artsin 代码是球马写的?从这段代码中唯一可以学到的是应该完全避免位域。以See this 为例。
标签: c bit-fields