C语言 链表节点的大小



关于sizeof运算符如何计算链表中一个节点的大小,我发现这有点棘手和递归。我将下面的结构作为列表中的一个节点:

struct ll_core
{
    char c_ll;
    struct ll_core * next;
};
printf("size of struct ll_core = %dnn",sizeof(struct ll_core));
它给了我一个答案。现在它如何决定大小8,因为添加单个结构元素的大小,它再次遇到相同的结构ll_core。这是一种循环或递归计算大小。请原谅,如果我在这样想的时候遗漏了什么基本的东西,请告诉我。

不再需要结构体的大小,因为该结构体只包含指向该结构体的指针,而不包含结构体本身。

指向struct ll_core的指针的大小与struct ll_core的大小无关,它们是两种不同的类型。一个是指针,另一个不是。

你不能声明一个"真正的"递归数据结构,因为它将是无限的。

假设你在32位机器上运行代码,指针的大小将是4字节。由于结构将在字边界上对齐,因此将填充3个字节,因此大小将为8个字节。

这个结构实际上就像

struct ll_core{
    char       c_11:
    char const byte[3];  //padded bytes for alignment reasons
    struct ll_core *next;
};

因为要增加单个结构元素的大小,它又会遇到相同的struct ll_core

不,它遇到一个指向struct ll_core指针。如果它遇到结构体本身,就会导致无限的大小。编译器知道struct ll_core *的大小和对齐要求,即使不知道struct ll_core的任何信息,所以它可以将成员的大小加上对齐所需的填充(在这种情况下是next成员)来找到struct ll_core的大小。

struct ll_core
{
    char c_ll;
    struct ll_core * next;
};

sizeof operator增加结构体ll_core成员的大小。这里是一个字符(c_ll)和一个指针(next)。

关于如何计算大小的更多信息

结构填充:

在64位系统中,数据将以8字节块的形式读写。因此,当计算结构的大小时,会发生填充。意味着编译器将在结构的成员之间插入一些间隙,以"对齐"体系结构地址边界。

struct ll_core
{
    char c_ll;
    /* 7 bytes of padding */
    struct ll_core * next;
 };

因此,在64位系统中,这个结构的大小将是16字节。

结构包装:

可以通过结构打包来防止编译器填充结构。在GCC中,这样做:

struct __attribute__((__packed__)) ll_core
{
    char c_ll;
    struct ll_core * next;
};

现在在64位机器上大小将是9字节。

sizeof(char) + sizeof(pointer)

编辑-从你的问题看来,你正在32位机器上运行。在32位机器中,数据将以4字节块的形式进行读写。

如果某些类型在某些地址上对齐,则许多处理器工作得更好。这意味着编译器将在单个char元素之后填充结构,以便指针位于本机单词边界上。

至于结构体中的"递归",没有,因为next字段是指向结构体的指针,而不是结构体本身。

你没抓住要点,仔细看…'next'只是一个指针。你不能只做struct ll_core next ..没有*。只要它是一个指针。该大小将仅计算指针的大小。一般情况下,指针的大小为4。

如果您有任何困惑,请从下一个中删除*并尝试编译代码。

有两个元素是字符(大小为1)和指针(大小为4),所以你会认为大小为5,但结构被填充为4字节(字大小)。该字符被填充为4字节,总共为8。

相关内容

  • 没有找到相关文章

最新更新