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));
}
我运行你的程序没问题。最后一个字节是随机的。这可能取决于您的系统。
我在这个 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));
}
我运行你的程序没问题。最后一个字节是随机的。这可能取决于您的系统。