c - 堆栈内存分配和对齐问题

标签 c

这是示例程序及其输出。

typedef struct{
    char name[30];
    int empno;
    int sal;
}empd, * empdPtr;

int main(){
    int x = 1;
    char y = 2;
    int z = 3;
    empd e;
    empdPtr ep = &e;

    printf("sizeof ep = %d e = %d \n",sizeof(ep),sizeof(e));
    printf("Address of e = %u, ep = %u x = %u y = %u z = %u\n",&e,&ep,&x,&y,&z);
    printf("Address of e.name = %u e.empno = %u e.sal = %u \n",&e.name,&e.empno,&e.sal);
    return 0;
}

$ ./a.exe
sizeof ep = 4 e = 40
Address of e = 2289536, ep = 2289532 x = 2289596 y = 2289595 z = 2289588
Address of e.name = 2289536 e.empno = 2289568 e.sal = 2289572

这里 &e 和 &z 的地址差是 52。但是 sizeof(e) 是 40。为什么编译器会多添加 12 个字节,尽管 40 个字节就足够了?

最佳答案

编译器可以自由地布局内存,因为它们认为适合更好的性能,例如,或者任何激励代码生成的东西。在资源非常有限的操作系统上,编译器可能会选择打包而不是调整访问速度。也许编译器正在生成一些隐式局部变量。造成这种情况的可能原因有很多。

关于c - 堆栈内存分配和对齐问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470221/

相关文章:

c - Strlen 导致段错误

c - 为什么我的数组元素被覆盖?

计算长字符串中的唯一单词

c - 指向数组元素的指针

c - C中的 float 转换为两个16位整数

c - gcc undefined reference `fopen_s'

c - 无法编译 io_uring

c - C语言中如何初始化二维数组

arrays - 全局二维数组值在模块之间变化

c - 使用 32 位读取以原子方式读取 4 个字节的数组