关于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。