int
的大小为4
字节,运行此程序时,输出为16
。
我可以知道输出为16
的原因吗?
#include <stdio.h>
typedef struct list {
int data;
struct list *next;
} list;
int main()
{
printf( "%d\n", sizeof(list) );
return 0;
}
答案 0 :(得分:1)
结构中每个成员的类型通常具有默认对齐方式,这意味着除非程序员另有要求,否则它将在预定边界上对齐。
正如您提到的,int
的大小为4
,系统体系结构上的指针大小为8
。因此,要对齐结构next
的{{1}}指针,编译器必须在结构上填充list
个字节。
某些编译器支持警告标志4
,该标志会生成有关结构填充的有用警告,其中之一就是-Wpadded
编译器。我在您的代码中添加了gcc
几个,以使事情变得清楚:
printf
使用#include <stdio.h>
typedef struct list {
int data;
struct list *next;
} list;
int main()
{
list l;
printf( "Size of struct list member data: %zu\n", sizeof(l.data) );
printf( "Size of struct list member next: %zu\n", sizeof(l.next) );
printf( "Size of struct list: %zu\n", sizeof(list) );
return 0;
}
标志编译代码时,收到警告消息:
-Wpadded
来自编译器的填充警告消息不言自明。
以下是运行时的输出:
# gcc -Wpadded prg.c
p.c:5:18: warning: padding struct 'struct list' with 4 bytes to align 'next' [-Wpadded]
struct list *next;
^
1 warning generated.
此外,#./a.out
Size of struct list member data: 4
Size of struct list member next: 8
Size of struct list: 16
运算符的结果类型为sizeof
。您应该使用size_t
格式说明符,而不要使用%zu
。