gpt4 book ai didi

c - C 代码中的局部变量对齐

转载 作者:太空狗 更新时间:2023-10-29 15:08:03 27 4
gpt4 key购买 nike

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

#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 位于 2 字节边界上,而它本可以放在 myStruct1 之后的接下来的 6 个字节上?

最佳答案

在您的代码中,myStruct1myStruct2 是两个局部变量,它们的地址不需要相邻。 GCC 将它们这样放置是完全合法的。

与此比较:

struct s myStruct[2];

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com