C 链表中的节点是单独的结构还是同一结构的一部分?
我有一个C语言的链表,如下所示:C 链表中的节点是单独的结构还是同一结构的一部分?,c,struct,linked-list,sizeof,singly-linked-list,C,Struct,Linked List,Sizeof,Singly Linked List,我有一个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 with
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
,因为指针在系统中是相同的。在您的例子中,不管它指向什么(int、char、struct等),它总是4个字节。在您的情况下,它将是4个字节。
因此,结构大小始终为8字节(int为4字节,指针为4字节)。
sizeof
指针在系统中是相同的。在您的例子中,不管它指向什么(int、char、struct等),它总是4个字节。在您的情况下,它将是4个字节。
因此,您的结构大小将始终为8字节(int为4字节,指针为4字节)。您的类型
链接
是指针,如果您没有将其与类型定义混为一谈,这一点会更加明显。指向的东西是一个单独的结构
(它也有自己的下一个
点等),它需要自己的存储
现在sizeof(curr->next)
和sizeof(List)
是指向struct的指针的大小,而不是struct intSet
的大小sizeof(*(curr->next))
和sizeof(struct intSet)
都是结构本身的大小,即需要为单个结构分配的空间量
从不遍历指针以找出整个列表的大小。如果您需要找出列表的整个大小,您需要自己遍历它并对元素进行计数,那么总大小是count*sizeof(struct intSet)
。但是,对于链接列表,您不太可能需要这些信息,因为如果您一次分配整个列表,您可以使用一个数组,而不使用下一个链接…您的类型链接
是一个指针,如果您没有将其与类型定义
混淆,这一点会更加明显。指向的东西是一个单独的结构
(它也有自己的下一个
点等),它需要自己的存储
现在sizeof(curr->next)
和sizeof(List)
是指向struct的指针的大小,而不是struct intSet
的大小sizeof(*(curr->next))
和sizeof(struct intSet)
都是结构本身的大小,即需要为单个结构分配的空间量
从不遍历指针以找出整个列表的大小。如果您需要找出列表的整个大小,您需要自己遍历它并对元素进行计数,那么总大小是count*sizeof(struct intSet)
。但是,对于链接列表,您不太可能需要这些信息,因为如果您一次分配整个列表,您可以只使用一个数组,而不使用下一个链接…关于sizeof的问题不是主要问题,特别是在32位的sizeof(intSet)为8,而在64位的sizeof(intSet)为8将是32位
关于PostgreSQL,要存储的对象是int
容器,因此长度可变。因此,要处理的对象不是intSet,而是一个包含大小和列表第一个元素的结构
typedef struct intSet *link;
typedef struct intSet {
int num;
link next;
};
struct intSetSized
{
int size;
intSet begin;
};
要声明为中的用户定义类型的是intSetSized
每次从列表中添加或删除某些内容时,您都会调整大小
注意如何为对象实现输入和输出函数intSetSized
中给出的示例更为棘手。关注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
每次从列表中添加或删除某些内容时,您都会调整大小
对于如何为对象实现输入和输出函数,要小心。
intSetSized
中给出的示例更为棘手。无论列表中有多少元素,结构本身是否总是有8个字节的大小。
结构的大小在运行时不会改变,但我怀疑它的8个字节,它应该是16个字节。我假设List
是一个指针,所以您得到的是指针的大小,而不是结构的大小。永远不要typedef
a(数据)指针。哦,你应该阅读你喜欢的C教科书中的指针。不管列表中有多少元素,结构本身的大小总是8字节吗
结构的大小在运行时不会改变,但我怀疑它的8字节,应该是16字节。我假设List
是一个指针,所以您得到的是指针的大小,而不是