考虑此程序:
#include "stdio.h"
#include "conio.h"
void main() {
struct ax {
char name[5]; //5 bytes
union {
float y; // 4 bytes
int z; // 4 bytes
} u; // sizeof this union should be 4
} t; //hence 4 + 5 should be 9
printf("%d",(int)sizeof(t));
getch();
}
为什么打印12张?
答案 0 :(得分:4)
简单的答案是该结构包含填充,从而使其大小(由sizeof
报告)大于其各个部分的总和。结构构件之间的填充通常存在以使每个结构构件对齐(例如,与32位或64位边界对齐)。末尾可能还会有填充,例如以使多个连续结构(例如数组)对齐。
C11标准的相关部分:
6.7.2.1(结构和联合的语义)
- ...结构对象中可能存在未命名的填充,但在其开头没有。
6.5.3.4(sizeof
)
- ...当应用于具有结构或联合类型的操作数时,结果是此类对象中的字节总数,包括内部填充和结尾填充。
答案 1 :(得分:2)
32位计算机上最可能的布局是:5字节字符+ 3字节填充+ 4字节并集= 12字节。
您可以自己查看内存布局:
#include <stddef.h>
#include <stdio.h>
printf("%zu\n", offsetof(struct ax, u)); // likely prints 8
答案 2 :(得分:0)
寻找数据对齐方式。联合将与下一个32位(或64位)地址对齐,(无论如何)在char[5]
开始后8个字节。
调试实例(并查看其内存布局)将向您展示char[5]
实际是如何被3个额外字节“填充”的。