链表中的节点是单独的结构还是同一结构的一部分?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表中的节点是单独的结构还是同一结构的一部分?相关的知识,希望对你有一定的参考价值。
我在C中有一个链表如下:
typedef struct intSet *link;
typedef struct intSet
int num;
link next;
intSet;
当我打印结构的各个成员的大小时,我得到以下内容:
sizeof(List) = 8 bytes //List is a newly created list
sizeof(curr->num) = 4 bytes // curr is just a node within the list
sizeof(curr->next) = 8 bytes
我的问题是:无论我们在列表中有多少元素,结构本身总是具有8字节的大小,或者那些仅与第一个节点有关的8个字节以及列表中的下一个节点是不同的实例。相同的结构?
我问的原因是因为我打算在PostgreSQL中将其实现为用户定义的数据类型,因此它要求我声明数据类型的长度是常量还是变量:
CREATE TYPE list (
internallength = 8? or internallength = variable
input = ..., output = ... );
如果它是变量我必须将我的结构表示更改为:
typedef struct intSet
int size;
int num;
link next;
intSet;
我怀疑如果节点是独立的,我可能不得不不断更新大小,而下一个节点的结构不同,结构的大小可能比最后一个节点多4个字节。任何提示或指示将不胜感激。
关于sizeof的关注不是主要问题,特别是在32位sizeof(intSet)将是8并且在64位中sizeof(intSet)将是32位。
关于PostgreSQL,您要存储的对象是int
容器,因此长度可变。因此,您要处理的对象不是intSet,而是包含列表大小和第一个元素的结构。
typedef struct intSet *link;
typedef struct intSet
int num;
link next;
;
struct intSetSized
int size;
intSet begin;
;
您想要在intSetSized
中声明为用户定义类型的udt。
每个你添加或删除列表中的东西,你调整size
。
小心你如何为你的对象intSetSized
实现输入和输出函数,这比udt中给出的例子更棘手。
你的类型link
是一个指针,如果你没有用typedef
混淆它会更明显。指向的是一个单独的struct
(它也有自己的next
点等),它需要自己的存储空间。
现在sizeof(curr->next)
和sizeof(List)
是指向struct的指针的大小,而不是struct intSet
的大小。 sizeof(*(curr->next))
和sizeof(struct intSet)
都是结构本身的大小,即你需要为单个结构分配的空间量。
sizeof
永远不会遍历指针以找出整个列表的大小。如果你需要找出列表的整个大小,你需要自己遍历它并计算元素,然后总大小是count * sizeof(struct intSet)
。但是,您不太可能需要链接列表的这些信息,因为如果您一次分配整个列表,您可以使用没有next
链接的数组...
sizeof
指针在系统中是相同的。在你的情况下,无论它指向什么(无论是int,char,struct等),它总是4个字节。在你的情况下它将是4个字节。因此,您的结构大小将始终为8个字节(int为4个字节,指针为4个字节)。
以上是关于链表中的节点是单独的结构还是同一结构的一部分?的主要内容,如果未能解决你的问题,请参考以下文章