我试图了解结构变量的打包如何影响堆栈上的局部变量分配地址的方式。

#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个结构变量和1个整数。 GCC编译器已决定分配如下地址:
&i          0x00007FFFFFFFDF0C
&myStruct1  0x00007FFFFFFFDF10
&myStruct2  0x00007FFFFFFFDF20

结构内没有填充-结构的大小为6个字节。

问题是,为什么myStruct2可以放在myStruct1之后的接下来的6个字节中,所以为什么它位于2字节边界上?

最佳答案

在您的代码中,myStruct1myStruct2是两个局部变量,它们的地址不必彼此相邻。对于GCC那样放置它们是完全合法的。

与此进行比较:

struct s myStruct[2];
myStruct[0]myStrcut[1]必须彼此相邻,因为它们位于同一阵列中。

关于c - C代码中的局部变量对齐,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28402899/

10-10 09:41