This question already has answers here:
Closed 9 months ago.
Memory position of elements in C/C++ union
(2个答案)
如标题所示,我想从一个union成员之前的其他成员获取其偏移量(以字节为单位)(使用
但对于工会来说
只是一个后续问题,这种行为的原因是因为联合的成员存储在同一块内存中?
作为par这个解释wikipedia offsetof我也期望得到一个4而不是0的值
这是因为所有联合字段共享相同的内存空间,而内存空间从联合本身的开头开始。
你也可以通过打印指针来检查它。
(2个答案)
如标题所示,我想从一个union成员之前的其他成员获取其偏移量(以字节为单位)(使用
offsetof
中定义的stddef.h
宏)。这对structs起到了预期的作用#include <stdio.h>
#include <stddef.h>
struct bio {
int age;
char name;
};
int main( void ) {
printf("%d\n", offsetof(struct bio, name)); // result is 4 , which is what i expected
}
但对于工会来说
#include <stdio.h>
#include <stddef.h>
union bio {
int age;
char name;
};
int main( void ) {
printf("%d\n", offsetof(union bio, name)); // 0
}
只是一个后续问题,这种行为的原因是因为联合的成员存储在同一块内存中?
作为par这个解释wikipedia offsetof我也期望得到一个4而不是0的值
最佳答案
在联合中,分配的空间是联盟本身中每个字段所需的字节的最大值。对于bio(假设sizeof(int)=4
):
sizeof(bio) = max(sizeof(int), sizeof(char)) = sizeof(4, 1) = 4
这是因为所有联合字段共享相同的内存空间,而内存空间从联合本身的开头开始。
bio.age = 24
bio.name = 'a' //a will use the first byte in the union, just like the first byte of the integer
你也可以通过打印指针来检查它。
关于c - 当检查 union 成员的字节偏移量时,offsetof返回0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54625547/