gpt4 book ai didi

c - 为什么 fwrite 为 uint8_t 写入两个字节?

转载 作者:行者123 更新时间:2023-12-02 00:23:06 25 4
gpt4 key购买 nike

对 C 不太熟练。这可能只是一个新手问题。

我试图向文件写入 3 个字节,但最终得到 4 个字节。

#include <stdio.h>
#include <stdlib.h>

struct a {
uint8_t x;
uint16_t y;
};

int main()
{
struct a record = { 1, 2 };
FILE *fp = fopen("example.bin", "w");
fwrite(&record, sizeof(struct a), 1, fp);
fclose(fp);
}

出于某种原因,我最终得到:

$ hexdump -C example.bin
00000000 01 00 02 00 |....|
00000004

我期待的是:01 02 00 .

这是我的 C 编译器的版本,以防与硬件/编译器相关。

$ cc --version
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.5.0
Thread model: posix

最佳答案

I am trying to write 3 bytes to file, but end up with 4.

您可能目标写入 3 个字节,但实际上正在写入 sizeof(struct a),这很可能是 4,因为编译器插入了一个填充字节以进行对齐。也许您假设结构的大小等于其成员大小的总和,并且未能考虑可能的填充。

一般来说,编译器可以出于对齐目的自由地插入填充(除非在结构体的第一个成员之前不能有任何填充)。

如果您编写各个成员,您将看到预期的输出:

  fwrite(&record.x, sizeof record.x, 1, fp);
fwrite(&record.y, sizeof record.y, 1, fp);

P.S.:确保对所有可能失败的函数(fopen、fwrite 等)进行错误检查。

关于c - 为什么 fwrite 为 uint8_t 写入两个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49896132/

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