c - struct _node* next; 的内存布局有区别吗?接下来是结构*;在 32 位 x86 或 amd 上?

标签 c struct

我正在学习C struct{}的内存布局;并想知道包含指向结构的指针变量的结构的内存布局如何,例如:-

typedef struct _node{ int data; struct _node* next;} node_t;

最佳答案

…a difference in how memory is laid for a pointer variable to a struct,…

不,结构指针在内存中的表示方式没有区别。根据 C 2018 6.2.5 28:

All pointers to structure types shall have the same representation and alignment requirements as each other.

对此有一些注意事项。这并不意味着您可以自由地将指针转换为一种类型的结构并将其用作指向另一种类型的结构的指针。脚注告诉我们:

The same representation and alignment requirements are meant to imply interchangeability as arguments to functions, return values from functions, and members of unions.

本质上,这允许您暂时来回转换指向结构的指针 - 只要当您使用它来引用结构的成员时,它已被转换回其原始类型。本质上,任何结构指针都可以是任何其他结构指针的临时持有者。

您还可以使用指向结构的指针执行一些其他操作。一条特殊规则规定,指向结构的指针经过适当转换后,会指向其第一个成员,反之亦然 (6.7.2.1 15)。因此,如果结构的第一个成员也是结构,则可以将指向一种结构类型的指针转​​换为指向另一种结构类型的指针,并使用它来访问成员。不过,这种情况相当罕见。

很大程度上,我希望所有指向具有相同表示和对齐要求的结构的指针的规则是在声明结构时使事情正常工作(与 struct foo; 一样,这使得它众所周知给编译器)但尚未定义(它告诉编译器其中有什么)。我们希望能够声明和定义指向结构的指针,因为到目前为止我们在源代码中只知道它们存在,而不是其中的内容。如果指向结构的指针的表示形式根据结构中的内容而变化,则编译器在 struct foo; 的裸声明之后对指针的含义将有不同的概念,而不是完整的定义的结构。

关于c - struct _node* next; 的内存布局有区别吗?接下来是结构*;在 32 位 x86 或 amd 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55602964/

相关文章:

c# - 在完全初始化结构之前访问结构的字段

c - 如何将值放入数组结构中?

c - 最后一个循环的输出不是预期的

ios - 将结构保存到 UserDefaults

c - C中的位域内存使用

go - 为什么当我通过反射构造它时,Golang yaml.v2 将我的结构转换为映射?

swift - Swift 3 中相互引用的结构

c - 释放指向结构的指针导致程序获得 "stuck"

c - 用于处理 C 中异质签名函数的函数指针的模式

c - 和条件的一种情况失败,但是代码执行