C 中填充字节的值

Values of padding bytes in C

我在这个 C 小程序中发现了一个奇怪的行为。我有 2 个结构,都带有填充字节,但在不同的地方。

第一个结构具有索引为[1:3]的填充字节,并且预期输出:静态变量被清零,因此填充值全部为0,堆栈上的局部变量在填充中留下垃圾值字节。示例输出:

Char is first, then int:
aa 60 8e ef ff ff ff ff 
aa 00 00 00 ff ff ff ff 

但是在第二个结构中,发生了一些奇怪的事情。此结构中的填充字节带有索引 [5:7],因此我希望非静态变量中有一些垃圾值,但每次输出都是:

Int is first, then char:
ff ff ff ff aa 7f 00 00 
ff ff ff ff aa 00 00 00 

为什么填充总是 7f 00 00

完整程序:

#include "stdio.h"
#include "stdint.h"
#include "stddef.h"

//  0 1 2 3 4 5 6 7
// |a|#|#|#|b|b|b|b|
typedef struct
{
    uint8_t a;
    uint32_t b;
} S1;

//  0 1 2 3 4 5 6 7
// |a|a|a|a|b|#|#|#|
typedef struct
{
    uint32_t a;
    uint8_t b;
} S2;

void print_bytes(void* mem, size_t num_bytes)
{
    for (size_t i = 0; i < num_bytes; i++)
        printf("%02x ", *((unsigned char*)mem + i));
    putc('\n', stdout);
}

int main()
{    
    S1 var1          = { .a = 0xAA, .b = 0xFFFFFFFF };
    static S1 var1_s = { .a = 0xAA, .b = 0xFFFFFFFF };

    printf("Char is first, then int:\n");
    print_bytes(&var1,   sizeof(S1));
    print_bytes(&var1_s, sizeof(S1));

    S2 var2          = { .a = 0xFFFFFFFF, .b = 0xAA };
    static S2 var2_s = { .a = 0xFFFFFFFF, .b = 0xAA };
    
    printf("\nInt is first, then char:\n");
    print_bytes(&var2,   sizeof(S2));
    print_bytes(&var2_s, sizeof(S2));
}

我运行你的程序没问题。最后一个字节是随机的。这可能取决于您的系统。