This question already has answers here:
Closed 9 months ago.
Memory position of elements in C/C++ union
(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/

10-11 23:08
查看更多