c - 链表中的节点是单独的结构还是同一结构的一部分?

标签 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 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/

相关文章:

c - 在结构定义中的 ' ' 标记之前应为 '='

performance - 如何在映射带有子 slice 的结构时降低时间复杂度?

C# 从 C DLL 导入一个结构

c - 指针运算

c - sqlite 中的表名长度会影响性能。为什么?

c - 为什么我会出现段错误? C语言编程

C++ 泛型链表独立类

c - 链表打印段错误

c++ - 访问整数的最后 2 个字节

c - 我无法更改 c、Visual Studio 中的当前路径