gpt4 book ai didi

c - fread_s 期间结构填充不正确

转载 作者:行者123 更新时间:2023-11-30 15:32:52 24 4
gpt4 key购买 nike

我定义了以下结构(u8是无符号字符的typedef)

struct
{
u8 length_directory_record;
u8 extended_attribute_record;
u8 location_of_extend[8];
union
{
u8 bytes[8];
struct
{
long little;
long big;
} endian;
}
} dir;

现在当我像这样读一个文件时

fseek(myfile, (SECTOR_SIZE*222)+34+34, 0);
fread_s(&dir, sizeof(dir), sizeof(u8), 18, myfile);

当我打印 data_length 值(小一个)时,我得到了奇怪的大数字。该值实际上存储为 LSB 和 MSB(都是字节顺序),这就是我在 union 中使用该结构的原因。

printf("Data Length of File Section: %u\n", dir.data_length.endian.little);

但是,当我执行相同的步骤而不读取结构时,它会起作用:

union{
u8 val[4];
long v;
} value;
fseek(myfile, ((SECTOR_SIZE * 222) + 34 + 34)+10, 0);
fread_s(&value, sizeof(value), sizeof(u8), 4, myfile);
printf("%u\n", value.v);

我的第一个版本有什么问题?为什么结构填充不正确或者哪里有我在这里没有看到的问题?

编辑:更多信息:我正在读取的文件是二进制文件。((SECTOR_SIZE * 222) + 34 + 34) 是结构开始的位置。我使用十六进制编辑器验证了这一点(扇区大小为 2048),因此第二个示例中的 +10 直接跳转到存储为 LSB 和 MSB 的 32 位数字的偏移量(因此 8 个字节)

开始结构的偏移量的文件转储:

30 00 DF 00 00 00 00 00 00 DF 30 C3 0B 00 00 0B C3 30   0.ß......ß0Ã....Ã0

data_length 的预期值为 770864 字节,但当前输出为 3862510(随机值)

最佳答案

您的对象可能未按您的预期布局。这通常是由于编译器在结构体中间插入了空格,以便它可以以最有效的方式访问结构体成员。

以下是您的结构的可能布局:

struct dir {
uint8_t length_directory_record; // Stored at offset [0, 1)
uint8_t extended_attribute_record; // Stored at offset [1, 2)
uint8_t location_of_extend[8]; // Stored at offset [2, 10)
// Implicit padding // Stored at offset [10, 12)
union
{
uint8_t bytes[8]; // Stored at offset [12, 20)
struct
{
int32_t little; // Stored at offset [12, 16)
int32_t big; // Stored at offset [16, 20)
} endian;
};
};

从您的代码来看,您似乎希望在偏移量 10 处找到并集。但很可能是在偏移量 1216 处找到它。

您可以使用以下方法验证 dir.bytes 的实际偏移量:

assert(offsetof(dir, bytes) == 12);

此外,大多数编译器都提供了一种打包结构的机制,以便不存在隐式填充。通常,您可以使用#pragma pack__attribute__((packed))

<小时/>

我们还可以简化此错误,以便您更明显:

struct object {
uint8_t a;
uint32_t b;
};

该对象将占用 8 个字节的空间,并且在 ab 之间有 3 个字节的填充。

关于c - fread_s 期间结构填充不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959764/

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