带数组的 C 结构的内存布局

Memory layout of C struct with arrays

假设我有一个 C 结构定义如下:

typedef struct 
{
  double array1[2];
} struct0_T;

内存是怎么布局的? struct 是只保存一个指针还是两个双打的值?之前我认为该结构包含一个指针,但今天我发现(令我惊讶的是)值存储在那里。不同的编译器之间是否有所不同?

该结构包含两个值。内存布局为 .array1[0],后跟 .array1[1],可选择地后跟一些填充量。

填充是唯一可以在编译器之间变化的部分(尽管在实践中,结构的唯一成员是数组,几乎肯定没有填充)。

虽然您可能听说过 C 中的数组是指针,但事实并非如此 - 数组是由所有成员对象组成的聚合类型,就像结构一样。只是在几乎所有表达式上下文中,数组的计算结果都是指向其第一个成员的指针。

上面的结构声明只是告诉编译器struct数据结构类型的变量将占用sizeof(struct0_T)字节的内存,一旦实例化该类型的变量,就会分配内存.

struct0_T s;

现在,s 包含两个 doubles 的数组。在这种情况下不会有填充。