【发布时间】:2023-03-26 16:23:01
【问题描述】:
我试图了解结构变量的打包如何影响堆栈上的局部变量分配地址的方式。
#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 个字节的边界上?
【问题讨论】:
-
@user3629249 但我不确定你所说的是否解释了为什么 &myStruct2 没有在 &myStruct1 之后立即启动(地址:0x00007FFFFFFFDF16)
-
结构的对齐方式取决于几个因素,例如#pragma 包、底层架构总线宽度、结构的任何成员所需的最大对齐方式、传递(或未传递)到的某些参数编译器、可寻址数据大小/对齐方式等。