数组是作为指针存储还是整个存储在C结构中?(是:当某些字段是指针时,如何将结构转储到磁盘?)

bad*_*adp 5 c serialization struct

我正在用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;
Run Code Online (Sandbox Code Playgroud)

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

read(disk_fd, directory_table_item, sizeof(fs_directory_table_item_t));
Run Code Online (Sandbox Code Playgroud)

...除了不可能工作,因为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));
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*bel 5

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

typedef struct {
    block_number_t inode;
    filename_t filename; //char[SOME_SIZE]
    some_other_field_t other_field;
} fs_directory_table_item_t;
Run Code Online (Sandbox Code Playgroud)

所以你的阅读声明:

read(disk_fd, directory_table_item, sizeof(fs_directory_table_item_t));
Run Code Online (Sandbox Code Playgroud)

将工作并引入数据.

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