Ok, tôi có một cấu trúc có chứa một phần tử struct in_addr
. Điều này sẽ tạo cấu trúc addrlist_t
ít nhất 12 Kích thước byte (8 + 4). Nền tảng là amd64
.bao gồm các thay đổi sizeof in_addr trong struct
#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;
}
Đây là sản phẩm hoàn toàn bất ngờ:
$cc main.c -o main -Wall -Wwrite-strings -pedantic -std=gnu99 -Wall -Werror
$./main
8 + 4 = 8
Điều này dường như không có ý nghĩa. Kích thước kết hợp phải tối thiểu là 12, không nhỏ hơn!
Nhưng bây giờ, khi #include <netdb.h>
được lấy ra, sản lượng dự kiến sẽ xuất hiện:
$./main
8 + 4 = 16
Những điều tương tự xảy ra khi -std=gnu99
được thay thế bằng -std=c99
.
Ai đó có thể giải thích hành vi này?
Đối với đầy đủ:
$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
Edit: định dạng/từ
@Gopi Không, vì kết quả của OP nhỏ hơn * so với tổng. Nó có vẻ rất huyền diệu. Tôi chạy nó trên ideone trong chế độ C99, in '4 + 4 = 8' (tôi đoán họ có môi trường 32-bit). – unwind
'#define _POSIX_C_SOURCE 200809L', mà không có nó tôi có thể repro đầu ra của bạn với clang 3.5 x64 trên Mac OS X 10.10. Với nó, 16 của nó, như mong đợi. – WhozCraig
Bạn đã rất gần với việc tìm kiếm nó cho mình :) –