MST

星途 面试题库

面试题:C语言结构体成员访问在复杂嵌套与内存对齐下的操作

考虑如下复杂结构体嵌套定义:struct Inner { char c; int num; }; struct Outer { struct Inner inner; double d; char arr[3]; }; struct Outer outer; 假设系统的内存对齐规则是4字节对齐,如何正确初始化并访问outer结构体中inner的num成员,同时说明在这种嵌套和内存对齐情况下,结构体整体大小的计算方式及对成员访问的潜在影响。
15.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 初始化并访问outer结构体中innernum成员
#include <stdio.h>

struct Inner {
    char c;
    int num;
};

struct Outer {
    struct Inner inner;
    double d;
    char arr[3];
};

int main() {
    struct Outer outer = {
       .inner = {
           .c = 'a',
           .num = 10
        },
       .d = 3.14,
       .arr = {'x', 'y', 'z'}
    };

    // 访问inner的num成员
    printf("outer.inner.num: %d\n", outer.inner.num);

    return 0;
}
  1. 结构体整体大小的计算方式
    • 对于struct Inner
      • char c占1字节,由于4字节对齐,补齐3字节,int num占4字节,所以struct Inner大小为1 + 3 + 4 = 8字节。
    • 对于struct Outer
      • struct Inner inner占8字节。
      • double d占8字节。
      • char arr[3]占3字节,补齐1字节以满足4字节对齐。
      • 因此,struct Outer的大小为8 + 8 + 3 + 1 = 20字节。
  2. 对成员访问的潜在影响
    • 内存对齐会导致结构体内部存在填充字节,这虽然增加了结构体的整体大小,但能提高内存访问效率。因为现代计算机在读取内存时通常以特定的对齐边界进行操作,对齐的数据能更高效地被读取和写入。例如,若数据未对齐,可能需要进行多次内存访问才能获取完整的数据,而对齐后可以一次读取完成,提升了性能。同时,在跨平台开发时,不同系统的内存对齐规则可能不同,这可能导致结构体大小和成员偏移量的变化,从而影响成员的正确访问,所以编写代码时需要注意内存对齐的兼容性。