gpt4 book ai didi

c - 数组是存储为指针还是完整存储在 C 结构中? (是 : How to dump structs to disk when some fields are pointers? )

转载 作者:太空狗 更新时间:2023-10-29 14:59:58 25 4
gpt4 key购买 nike

我正在用 C 编写一个 FUSE 插件。我正在通过如下结构跟踪文件系统中的数据结构:

typedef struct {
block_number_t inode;
filename_t filename; //char[SOME_SIZE]
some_other_field_t other_field;
} fs_directory_table_item_t;

显然,我必须在某个时候从(到)磁盘读取(写入)这些结构。我可以将结构视为字节序列并执行如下操作:

read(disk_fd, directory_table_item, sizeof(fs_directory_table_item_t));

...除非它不可能工作,因为 filename 实际上是指向 char 数组的指针。

我真的很想避免编写如下代码:

read(disk_df, *directory_table_item.inode,       sizeof(block_number_t));
read(disk_df, directory_table_item.filename, sizeof(filename_t));
read(disk_df, *directory_table_item.other_field, sizeof(some_other_field_t));

...对于代码中的每个结构,因为我必须在不少于三个不同的地方(定义、读取、写入)复制代码和更改。

任何 DRYer 但仍然可维护的想法?

最佳答案

字符串的内存将成为你的结构的一部分,即使在许多情况下数组类型被提升为指针,存储在结构中的类型是数组,而不是指针。

typedef struct {
block_number_t inode;
filename_t filename; //char[SOME_SIZE]
some_other_field_t other_field;
} fs_directory_table_item_t;

所以你的阅读语句:

read(disk_fd, directory_table_item, sizeof(fs_directory_table_item_t));

将工作并引入数据。

当读取和写入内存块时,您应该考虑填充。填充是编译器添加的额外空字段,用于对齐相关边界上的数据;例如一个 32 字节的值通常应该从内存中的 4 字节边界开始,以允许处理器有效地读取它。这通常没什么好担心的,但是当将结构持久化到磁盘时,如果您使用其他设置重新编译代码,它可能会造成问题。经常有一些禁用填充的#pragma指令,我认为它在MS Visual c++中被命名为#pragma pack

关于c - 数组是存储为指针还是完整存储在 C 结构中? (是 : How to dump structs to disk when some fields are pointers? ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514245/

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