c-LinkedList节点的大小



int大小为4字节,运行此程序时,输出为16
我可以知道输出为16的原因吗?

#include <stdio.h>
typedef struct list {
int data;
struct list *next;
} list;
int main()
{
printf( "%dn", sizeof(list) );
return 0;
}

结构中每个成员的类型通常都有一个默认对齐方式,这意味着除非程序员另有要求,否则它将在预先确定的边界上对齐。

正如您所提到的,int的大小是4,您的系统架构上的指针大小将是8。因此,为了对齐结构listnext指针,编译器必须用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: %zun", sizeof(l.data) );
printf( "Size of struct list member next: %zun", sizeof(l.next) );
printf( "Size of struct list: %zun", 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格式说明符,而不是%d

相关内容

  • 没有找到相关文章