我在 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 .
每次在列表中添加或删除内容时,都会调整大小
。
注意如何为对象 intSetSized
实现输入和输出函数,udt 中给出的示例更加棘手。 .
关于c - 链表中的节点是单独的结构还是同一结构的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52128309/