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

我有一个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
,因为指针在系统中是相同的。在您的例子中,不管它指向什么(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
是一个指针,所以您得到的是指针的大小,而不是