我在 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 intSet
的大小。sizeof(*(curr->next))
和sizeof(struct intSet)
都是结构本身的大小,即您需要为单个结构分配的空间量。
sizeof
永远不会遍历指针来找出整个列表的大小。如果您需要找出列表的整个大小,则需要自己遍历并计算元素,则总大小为count * sizeof(struct intSet)
。但是,您不太可能需要链表的此信息,因为如果您一次分配整个列表,则可以只使用没有next
链接的数组...
指针的sizeof
在系统中是相同的。在您的情况下,无论它指向什么(无论是 int、char、struct 等(,它始终是 4 个字节。在您的情况下,它将是 4 个字节。 因此,您的结构大小将始终为 8 个字节(int 为 4 个字节 + 指针为 4 个字节(。