从堆内存中使用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/