在C语言中,标准布局结构体中具有单个基本类型数组成员的内存布局保证是连续存储数组元素,没有任何间隔或填充字节。
以下是一个示例代码,说明了这个内存布局保证:
#include
// 定义一个标准布局结构体
struct MyStruct {
int array[5];
};
int main() {
struct MyStruct s;
// 访问数组元素
for (int i = 0; i < 5; i++) {
s.array[i] = i + 1;
}
// 打印数组元素的内存地址
for (int i = 0; i < 5; i++) {
printf("Element %d: %p\n", i, &(s.array[i]));
}
return 0;
}
在这个示例中,MyStruct
是一个具有单个整型数组成员array
的结构体。我们通过循环将数组元素赋值为1到5,并打印每个元素的内存地址。
输出结果将显示每个数组元素的内存地址,这些地址应该是连续的,没有任何间隔或填充字节。例如,输出可能类似于:
Element 0: 0x7ffeeb2c3ac0
Element 1: 0x7ffeeb2c3ac4
Element 2: 0x7ffeeb2c3ac8
Element 3: 0x7ffeeb2c3acc
Element 4: 0x7ffeeb2c3ad0
这表明每个数组元素在内存中是连续存储的。
需要注意的是,这个内存布局保证仅适用于标准布局结构体,并且在某些特殊情况下可能会受到编译器的优化或填充字节的影响。因此,如果需要确保特定的内存布局,应该使用#pragma pack
或__attribute__((packed))
等编译器指令来控制结构体的对齐方式。
上一篇:标准布局和尾部填充