c - 如何从堆内存数组 INSIDE STRUCT 写入?

标签 c file pointers heap-memory fwrite

从堆内存中使用fwrite()的问题是,您实际上只是在写入一个指向数据的指针。当您再次执行代码时可能会恢复相同的数据。但无法保证该指针与指向旧数据的指针相同。我需要 fwrite() 堆内存方面的帮助。

struct {
    char SomeStringData[12];
    struct LittleStruct* LittleStructArray;
} BigStruct = {
    .SomeStringData = "HELLO WORLD",
    .LittleStructArray = malloc(sizeof (struct LittleStruct)*NumberOfArrayElements);
}

fwrite(&BigStruct, sizeof(BigStruct), 1, DataFile);

最佳答案

当您使用 fwrite 写入时,您只关心指针指向的内容是否写入磁盘。当您读取同一个文件时,您通常不关心数据读入内存中的哪个位置。

 char* p = malloc(10); // some arbitrary address on the heap
 strcpy(p, "hello");
 fwrite(p, 1, 6, somefilepointer); // now what p points to is written

当您现在使用 fread 读取时,值将放置在 q 所在的位置。

 char* q = malloc(10); // some other arbitrary address on the heap
 fread(q, 1, 6, somefilepointer); 

编辑:问题更改后。

当您在结构体中再次分配时,您将需要单独编写该部分,因为它将存在于堆的另一部分中。 fwrite 仅写入连续字节,因此写入结构将类似于

fwrite(&BigStruct, sizeof(BigStruct), 1, DataFile);
fwrite(BigStruct.LittleStructArray, 
  sizeof(BigStruct.LittleStructArray), NumberOfArrayElements, DataFile);

更好

fwrite(BigStruct.SomeStringData, 1, sizeof(SomeStringData), DataFile);
fwrite(BigStruct.LittleStructArray, 
  sizeof(BigStruct.LittleStructArray), NumberOfArrayElements, DataFile);

关于c - 如何从堆内存数组 INSIDE STRUCT 写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58358614/

相关文章:

c - 在c中使用fscanf读取ini文件

编译: undefined reference to

在C中将读取的数字转换为无符号短整型

python - 如何从二进制文件中读取除最后 X 字节以外的所有字节?

c++ - std::unique_ptr 不能被引用——它是一个被删除的函数

c - 如何在 dbx 中的内存位置放置断点?

c++ - 从 C++ 样式打印转换为 my_printf()

python - 音频未加载

c++ - 不存在从 LoadTask::MasterFilePtr 到 MasterFile * 的合适转换函数

我可以使用 & 运算符在函数中获取有效指针,即使该函数已在 golang 中返回