【发布时间】:2011-11-29 13:31:26
【问题描述】:
我正在编写一个程序来解压 PE 文件。我有一个结构 Pe_SymbolHeader。它看起来像这样:
typedef struct _Pe_SymbolHeader {
char Name[8]; // 8
uint32_t Value; // 12
uint16_t SectionNumber; // 14
uint16_t Type; // 16
uint8_t StorageClass; // 17
uint8_t NumberOfAuxSymbols; // 18
} Pe_SymbolHeader;
gcc 告诉我这个结构的大小是 20 字节。
printf("sizeof Pe_SymbolHeader %d\n", sizeof(Pe_SymbolHeader));
我决定在堆栈上放置一个 Pe_SymbolHeader 并查看所有内容在内存中的位置
Pe_SymbolHeader test
printf("%p\n", &(test.Name));
printf("%p\n", &(test.Value));
printf("%p\n", &(test.SectionNumber));
printf("%p\n", &(test.Type));
printf("%p\n", &(test.StorageClass));
printf("%p\n", &(test.NumberOfAuxSymbols));
这给了我以下,这似乎没问题:
0x7fffffffe150
0x7fffffffe158
0x7fffffffe15c
0x7fffffffe15e
0x7fffffffe160
0x7fffffffe161
如果 gcc 使用 18 个字节来存储我的结构,为什么 sizeof 告诉我结构将占用 20 个字节?
编辑:好的,看来 gcc 正在尝试帮助我的事情正在杀死我,并且有几个答案是正确的。我只能投一个,但感谢那些回答的人。
【问题讨论】:
-
真正的关键词是alignment和padding (