LinkedList节点的大小

时间:2018-11-17 01:38:24

标签: c pointers memory struct linked-list

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;
}

1 个答案:

答案 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