C代码中的局部变量对齐

时间:2015-02-09 04:39:26

标签: c struct stack padding

我试图理解结构变量的打包如何影响堆栈上的局部变量被赋予地址的方式。

#include <stdio.h>

struct s
{
    short s1;
    short s2;
    short s3;
};

int main()
{
    struct s myStruct1;
    struct s myStruct2;

    myStruct1.s1 = 1;
    myStruct1.s2 = 2;
    myStruct1.s3 = 3;

    myStruct2.s1 = 4;
    myStruct2.s2 = 5;
    myStruct2.s3 = 6;

    int i = 0xFF;

    printf("Size of struct s: %d", sizeof(myStruct1));
    return 0;
}

在我上面的程序中,我有2个struct变量和1个整数。 GCC编译器决定分配这样的地址:

&i          0x00007FFFFFFFDF0C
&myStruct1  0x00007FFFFFFFDF10
&myStruct2  0x00007FFFFFFFDF20

结构中没有填充 - 结构的大小是6个字节。

问题是为什么myStruct2在myStruct1之后的下一个6字节上是2字节边界的?

1 个答案:

答案 0 :(得分:1)

在您的代码中,myStruct1myStruct2是两个本地变量,它们的地址不需要彼此相邻。对于海湾合作委员会来说,这样做是完全合法的。

与此相比:

struct s myStruct[2];

myStruct[0]myStrcut[1]必须彼此相邻,因为它们位于同一个数组中。