【发布时间】:2016-05-08 01:40:12
【问题描述】:
我试图使用 void 指针作为 Struct 数组来将几个 struct 对象一起保存在磁盘上。我想使用 void 指针将记录写入磁盘(认为是由记录组成的集群)。
void addRecordToDataPage(City record)
{
void* data = malloc(sizeof(City)*RECORD_COUNT);
FILE* fp;
fp=fopen("sampledata2.dat", "rb");
City pageofCity [RECORD_COUNT]; //City is my Struct.
if(!fp) //if it is first access, put the record to pageofCity[0]..
{
pageofCity[0]=record;
data=pageofCity;
writeDataPageToDisk(data); ..and call the write func.
return;
}
fread(&data, sizeof(City)*RECORD_COUNT, 1, fp);
int i=0;
while( (City *)data )
{
pageofCity[i] = ((City *)data)[i];
i++;
}
pageofCity[i]=record;
}
//and this is my writer function.
void writeDataPageToDisk(void* dataPage)
{
FILE* fp;
fp=fopen("sampledata2.dat", "a");
if(!fp)
{
fp=fopen("sampledata2.dat", "wb");
writeDataPageToDisk(dataPage);
}
fwrite(dataPage, sizeof(City)*RECORD_COUNT,1,fp);
fclose(fp);
}
在pageofCity[i] = ((City *)data)[i]; 的行中,我遇到了内存错误。
这是我在这个网站上的第一个问题,请原谅我的错误:)。
【问题讨论】:
-
你应该先阅读How to Ask。并提供minimal reproducible example。目前还不清楚你真正想要什么。指针不应存储在文件中,因为它们在下次运行时非常可能无效。
-
然后格式化和缩进这个。不可读。
-
这段代码存在风格和其他问题,但快速浏览您的问题似乎是这一行
while( (City *)data )。data永远不会改变,所以这看起来像是一个无限循环。 -
不要忘记关闭您打开的文件。
-
@MarcKhadpe:我同意您确定的循环有问题,并且循环不会根据条件终止。但是
i在循环中发生了变化,每次都用来访问不同的City,所以最终会崩溃,下标超出范围。
标签: c arrays pointers struct void