0

如下结构体所示,后面要补1个字节var1,因为short在结构体中使用,所以要在后面补1个字节var3。有了这个,总数应该是 6。这就是我在 Visual Studio 中得到的值。Wikipedia on Data structure alignment也提到了这一点。

typedef struct {char var1; short var2; char var3;} Bytes;

但在 GCC 中,它给出的大小为 8 个字节。请让我知道这种行为。


嗨,杰克,

我对以下结构进行了实验。

typedef struct
{
    char  charVar1;
    short shortVar2;
    char  charVar3;
}tsByte;

printf("\n Sizeo of Byte        : %d", sizeof(Byte));
printf("\n Sizeo of charVar1    : %d", sizeof(Byte.charVar1));
printf("\n Sizeo of shortVar2   : %d", sizeof(Byte.shortVar2));
printf("\n Sizeo of charVar3    : %d", sizeof(Byte.charVar3));
printf("\n Address of charVar1  : %x", &Byte.charVar1);
printf("\n Address of shortVar2 : %x", &Byte.shortVar2);
printf("\n Address of shortVar3 : %x", &Byte.charVar3);

结果如下。

Sizeo of Byte        : 8
Sizeo of charVar1    : 1
Sizeo of shortVar2   : 2
Sizeo of charVar3    : 1
Address of charVar1  : 4007e90
Address of shortVar2 : 4007e92
Address of shortVar3 : 4007e94

当结构用作数组的元素时,通常需要在结构的末尾填充以确保正确对齐(其所有成员)。但有点混淆了最后一个元素的填充。填充“最后一个元素”是基于 8/16/32 位控制器架构还是基于最大成员大小(这里简称)。

我觉得在 Visual Studio 中它基于最大的成员大小,所以你得到的大小为 6 个字节。而使用 gcc 编译器,它基于控制器架构,并且由于我使用的是 32 位控制器,它与 4 字节内存对齐。因此在 gcc 编译器中它是 8 个字节。如果我错了,请纠正我。

4

3 回答 3

1

您将需要编写更多代码来研究编译器之间的差异。例如,尝试如下代码片段:

    // define a structure
    typedef struct {char var1; short var2; char var3;} Bytes;

    // allocate storage for the structure
    Bytes data;

    // tell me stuff about that structure
    printf("\nsizeof Bytes=%d, sizeof var1=%d, sizeof var2=%d, sizeof var3=%d",
         sizeof(data), sizeof(data.var1), sizeof(data.var2), sizeof(data.var3));

在 Eclipse/Microsoft C 编译器上,我得到:

    sizeof Bytes=6, sizeof var1=1, sizeof var2=2, sizeof var3=1

那么,为什么 Bytes=6 而 sizeof vars 总和为 4?这是由以下内容回答的:

    printf("\naddrof var1=%08x", &data.var1);
    printf("\naddrof var2=%08x", &data.var2);
    printf("\naddrof var3=%08x", &data.var3);

产生:

    addrof data=0012ff40
    addrof var1=0012ff40
    addrof var2=0012ff42
    addrof var3=0012ff44

因此,即使 var1 是 achar它使用两个字节,因此 Microsoft C 编译器实现了 K&R 记录的 ANSI C!

您将需要使用 GCC 运行类似的代码,以确定它是如何格式化struct Bytes.

于 2013-08-02T18:57:40.517 回答
0

如果您需要特定的对齐方式,您可以随时使用#pragma pack

正如其他人已经指出的那样,您可以使用sizeof()运算符和标准 Coffsetof()宏来确定结构定义、编译器和对齐设置的特定组合的实际对齐方式。

于 2013-08-05T04:52:47.927 回答
0

如下结构所示,'var1' 后应填充 1 个字节,由于结构中使用了 short,所以在 'var3' 后又填充了一个字节。有了这个,总数应该是6。

错误的。C 语言没有规定总大小必须是多少——它是实现定义的。编译器可以自由地在成员之间或在结构末尾添加它认为合适的填充字节。它可以选择不添加填充,在 2 或 4 字节边界上对齐成员,或者完全其他的东西。所有这些行为都是 C 标准允许的。

不同的编译器产生不同的值这一事实只是表明并非所有的编译器都是相同的。在这方面,两种编译器都符合 C 标准。

于 2013-08-02T19:24:19.393 回答