#include <stdio.h>
#include <stdlib.h>
int main() {
// 动态分配Outer结构体的内存
struct Outer *outer = (struct Outer *)malloc(sizeof(struct Outer));
if (outer == NULL) {
printf("内存分配失败\n");
return 1;
}
// 根据内存对齐规则初始化各成员变量
outer->inner.num1 = 10;
outer->inner.ch = 'A';
outer->inner.num2 = 123456789L;
outer->value = 3.14159;
outer->count = 5;
// 输出初始化后的值
printf("inner.num1: %d\n", outer->inner.num1);
printf("inner.ch: %c\n", outer->inner.ch);
printf("inner.num2: %ld\n", outer->inner.num2);
printf("value: %lf\n", outer->value);
printf("count: %d\n", outer->count);
// 释放内存
free(outer);
return 0;
}
内存对齐对内存分配和初始化的影响
- 内存分配:
- 在
struct Inner
中,short num1
占2字节,char ch
占1字节,long num2
在常见系统(如x86 - 64)中占8字节。由于内存对齐,struct Inner
的大小不是简单的2 + 1+ 8 = 11
字节,而是要对齐到8字节的倍数,所以struct Inner
的大小为16字节(num1
占2字节,ch
占1字节,然后填充5字节对齐到8字节边界,num2
占8字节)。
- 在
struct Outer
中,struct Inner inner
占16字节,double value
占8字节,int count
占4字节。同样由于内存对齐,struct Outer
的大小要对齐到8字节的倍数,所以struct Outer
的大小为32字节(inner
占16字节,value
占8字节,count
占4字节,然后填充4字节对齐到32字节边界)。malloc
分配内存时,会按照struct Outer
的实际大小32字节来分配。
- 初始化:
- 初始化时,各成员变量按照结构体定义的顺序依次存储在分配好的内存中,并且要满足内存对齐的要求。例如
inner
成员内部各变量按上述对齐方式存储,value
成员要从8字节对齐的地址开始存储,count
成员在value
之后按4字节对齐存储。