连续定义两个结构体,但这两结构体占用的内存空间是不连续的,这是为啥?

#include <stdio.h>
#include <stdlib.h>

struct stu{
    char a;
    int b;
    char c;
};

int main(){
    struct stu stu1;
    stu1.b = 12;
    struct stu stu2;
    stu2.b = 10;
    printf("%u\n", (int)sizeof(stu1));
    return 0;
}

代码如上。
(顺便问一下,如果不给stu1和stu2的b元素幅值,貌似stu1和stu2在同一个地址,或者说,gcc编译器优化掉了一个未初始化且未使用的变量?)

打印各个变量的地址,如下:
&stu1
0x7fffffffe000
&stu1.a
0x7fffffffe000
&stu1.b
0x7fffffffe004
&stu1.c
0x7fffffffe008
&stu2
0x7fffffffe010
&stu2.a
0x7fffffffe010
&stu2.b
0x7fffffffe014
&stu2.c
0x7fffffffe018

stu1和stu2的内存占用都没问题,各占12个字节,但是二者之间为什么空出来4个字节?也就是0x7fffffffe0c~0x7fffffffe00f这段空间。
栈上分配内存不应该是连续的么?
谢谢!

阅读 3.8k
1 个回答

地址优化导致的,CPU在访问字边界地址的时候速度会快,所以有些编译器把变量的地址优化成4或者8的整数倍,导致两个变量之间出现空隙。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进