好的,我有一个包含struct in_addr
元素的结构。
这应该使结构addrlist_t
的大小至少为 12字节(8 + 4)。该平台为amd64
。
#include <netinet/in.h> // struct in_addr
#include <stdio.h> // printf()
#include <netdb.h> // toggles size of struct addrlist_t
struct addrlist_t {
struct addrlist_t *next;
struct in_addr h_addr;
};
int main(int argc, char *argv[]) {
printf("%zu + %zu = %zu\n",
sizeof (struct addrlist_t *), sizeof (struct in_addr),
sizeof (struct addrlist_t)
);
return 0;
}
这是完全出乎意料的输出:
$cc main.c -o main -Wall -Wwrite-strings -pedantic -std=gnu99 -Wall -Werror
$./main
8 + 4 = 8
这似乎毫无意义。组合尺寸应至少为12,而不是更小!
但现在,当删除#include <netdb.h>
时,会显示预期的输出:
$./main
8 + 4 = 16
当-std=gnu99
替换为-std=c99
时,会发生同样的事情。
有人可以解释这种行为吗?
为了完整性:
$file main
main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=709ab89d012d8b5a6ae7423fd80ce643288cba95, not stripped
编辑:格式化/单词
答案 0 :(得分:15)
这是因为struct in_addr h_addr
成员有一个不幸的名字。
<netdb.h>
包含:
# define h_addr h_addr_list[0] /* Address, for backward compatibility.*/
运行gcc -E main.c以查看预处理后代码的外观, 你的struct addrlist_t基本上变成了这个:
struct addrlist_t {
struct addrlist_t *next;
struct in_addr h_addr_list[0];
};
这与你的意图完全不同。