gpt4 book ai didi

c - LinkedList节点的大小

转载 作者:行者123 更新时间:2023-11-30 14:44:55 26 4
gpt4 key购买 nike

int大小是4 byte 并在运行该程序时,得到输出为 16 .
我可以知道输出为 16 的原因吗? ?

#include <stdio.h>

typedef struct list {
int data;
struct list *next;
} list;

int main()
{
printf( "%d\n", 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: %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 格式说明符而不是 %d

关于c - LinkedList节点的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53347433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com