struct_node*next的内存布局是否有差异;和struct*next;在32位x86或amd上?

struct_node*next的内存布局是否有差异;和struct*next;在32位x86或amd上?,c,struct,C,Struct,我正在学习C结构{}的内存布局;并且想知道包含指向结构的指针变量的结构的内存布局如何,例如:- typedef struct _node{ int data; struct _node* next;} node_t; …在如何为指向结构的指针变量放置内存方面存在差异 不,结构指针在内存中的表示方式没有区别。根据C 2018 6.2.5 28: 指向结构类型的所有指针应具有彼此相同的表示和对齐要求 对此有一些警告。这并不意味着您可以自由地将指针转换为一种类型的结构,并将其用作指向另一种类型结构的

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

typedef struct _node{ int data; struct _node* next;} node_t;
…在如何为指向结构的指针变量放置内存方面存在差异

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

指向结构类型的所有指针应具有彼此相同的表示和对齐要求

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

相同的表示和对齐要求意味着作为函数参数、函数返回值和联合成员的互换性

本质上,这允许您做的是将指针临时来回转换为结构,只要您使用它引用结构的成员时,它已转换回其原始类型。本质上,任何结构指针都可以是任何其他结构指针的临时保持器

使用指向结构的指针还可以做一些其他事情。一条特殊规则规定,指向适当转换的结构的指针指向其第一个构件,反之亦然(6.7.2.1.15)。因此,如果结构的第一个成员也是结构,则可以将指向一种结构类型的指针转换为指向另一种结构类型的指针,并使用它访问成员。不过,这种情况相当罕见


在很大程度上,我希望所有指向具有相同表示和对齐要求的结构的指针的规则是,当一个结构已经声明(如
struct foo;
,它使编译器知道它)但尚未定义(它告诉编译器它包含什么)时,就可以工作。我们希望能够声明和定义指向结构的指针,而到目前为止,我们在源代码中所知道的只是它们的存在,而不是它们中的内容。如果指向某个结构的指针的表示形式根据其中的内容而有所不同,那么编译器在声明
struct foo之后会对指针的内容有不同的概念比它有一个完整的结构定义。嗯,第二个。
struct*
在我尝试过的所有编译器中都是语法错误。您使用的编译器是什么?大概4个字节用于
数据
,然后4个字节用于
下一个
@EricPostpischil OP询问的部分“…在32位x86或amd上?”。