【问题标题】:Size of LinkedList node [duplicate]LinkedList 节点的大小 [重复]
【发布时间】:2019-04-20 04:58:36
【问题描述】:

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

【问题讨论】:

  • 因为在您的机器上,与指针大小配对的填充等于 8。肯定存在此问题的重复项

标签: c pointers memory struct linked-list


【解决方案1】:

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

正如您提到的,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多