如何从结构内部的堆内存数组中进行fwrite?

How to fwrite from heap memory array INSIDE STRUCT?

从堆内存中 fwrite()ing 的问题是你实际上只是在写一个指向数据的指针。再次执行代码时可能会恢复相同的数据。但是没有什么能保证指针与指向旧数据的指针相同。我需要帮助 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);