MST

星途 面试题库

面试题:C语言动态分配嵌套结构体内存并考虑内存对齐与初始化

已知结构体定义:struct Inner { short num1; char ch; long num2; }; struct Outer { struct Inner inner; double value; int count; }; 请编写代码动态分配一个Outer结构体的内存,根据内存对齐规则正确初始化各成员变量,然后释放内存,并说明在这个过程中内存对齐是如何影响内存分配和初始化的。
28.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#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;
}

内存对齐对内存分配和初始化的影响

  1. 内存分配
    • 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字节来分配。
  2. 初始化
    • 初始化时,各成员变量按照结构体定义的顺序依次存储在分配好的内存中,并且要满足内存对齐的要求。例如inner成员内部各变量按上述对齐方式存储,value成员要从8字节对齐的地址开始存储,count成员在value之后按4字节对齐存储。