sizeof(struct)和sizeof(union)

时间:2014-04-03 17:14:43

标签: c

struct One{
       int x[6];
       short y[12];
} a;

union Two{
       int x[6];
       short y[12];
} b;

假设整数是32位,短路是16位。

一个。什么是(a)和sizeof(b)的大小?

湾如果是&a = 0x00320000,那么&a.y是什么?

℃。如果是&b = 0x00320400,那么&b.y是什么?

有人可以解释如何派生出union和struct的大小,以及如何获取地址的值。我理解& a和& b分别表示a和b的地址。但是,我不确定如何得出什么& a.y和& b.y会返回。

3 个答案:

答案 0 :(得分:4)

一个。你不知道。这是sizeof(struct One)的用途。认为结构的大小是其元素的总和是一种常见的误解 - 实现可以在任何点填充结构(除了在开头)以用于对齐原因 - 实现可以填充任何成员之后的任何数量的结构,尽管以相同初始类型开头的两个结构具有相同偏移的相应成员(如注释中所指出的)。对于联合,它是最大字段的大小,即max(sizeof(b.x), sizeof(b.y))

湾和c。使用宏offsetof()作为可移植方式来查找结构中字段的偏移量。 &a.y只是((char *) a)+offsetof(struct One, y)。对于联盟,&b&b.x&b.y都是相同的。

编辑:您可以使用特定于编译器的选项来控制填充和对齐。例如,请参阅gcc's structure padding pragmas

答案 1 :(得分:1)

即使在大多数情况下,答案是实现定义的调试和故障排除的程序员需要知道(可能的)答案是什么,在他/她的平台上:

  

一个。什么是(a)和sizeof(b)的大小?

sizeof a = 6 * 4 + 12 * 2 = 48. 重要:如果您将12更改为13,此计算可能会出错,因为填充会通常是添加,可能是2个字节,因此结构的大小是其元素大小的总和。

sizeof b = max(6 * 4,12 * 2)= 24,因为在此联合中,xy被重叠。如果您将12更改为13,则可能会再次填充。

  

湾if& a = 0x00320000,什么是& a.y?

& a.y = 0x00320000 + 6 * 4 = 0x00320018

  

℃。 if& b = 0x00320400,什么是& b.y?

& b.y =& b(保证)

答案 2 :(得分:0)

a。)A的大小将是sizeof(int)* 6 + sizeof(short)* 12或72字节(可能加上几个字节用于对齐)。而b的大小将是48,最大成员的大小。基本上,联合被用作别名相同内存空间的一种方法,因此编译器在确定联合将在内存中占用多少空间时必须使用最大成员的大小。

b。)地址为0x00320018。

c。)地址将为0x00320400,因为b.X和b.Y都存储在同一位置。