【问题标题】:Void pointer as struct array in Cvoid指针作为C中的结构数组
【发布时间】: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


【解决方案1】:

您的代码存在多个问题。

您的错误最可能的原因如下:

while( (City *)data )

data 的值永远不会改变,并且您在循环中每次都在前一个字节连续读取内存。

if (!fp)
{
    int recordsRead = fread(&data, sizeof(City), READ_COUNT, fp);
    int i=0;
    while( i < recordsRead)
    {
    }
}
pageOfCity[recordsRead] = record;

此外,由于您将一个额外的元素附加到您的数组中,您需要为该记录声明额外的空间。

City pageofCity [RECORD_COUNT + 1]; //City is my Struct.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2012-11-08
    • 2011-04-15
    • 2014-10-01
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多