为什么我变量 - 正在使用而没有被初始化的错误?

时间:2012-02-28 16:04:45

标签: c++ runtime-error fwrite initialization

我想使用这个程序将哈希表写入文件 但是我得到了

  

无法将参数1从'fpinfo'转换为'const void *'

编译时出错

如果我用struct fpinfo e;更改struct fpinfo *e,我会收到运行时错误:

  

正在使用变量'e'而未初始化。

我试图通过将其声明为struct fpinfo *e=NULL;来初始化e。这要么不起作用。

请照常给我你的帮助。

WriteHTtoFile(struct fpinfo t[][B_ENTRIES],int this_tanker,tanker_record tr[][BUCKETS])
{
    //struct fpinfo *e;
    struct fpinfo e;
    int i=0, mask;
    char filename[sizeof ("file0000.txt")];
    sprintf(filename, "filee%d.txt", this_tanker);
    curr_tanker++;
    //fp = fopen(filename,"w");
    FILE *htfile=fopen(filename,"w+b");
     system("cls");
if (htfile != NULL)  
        { 
         for (int j = 0; j < BUCKETS; ++j) 
        {
            for (int k = 0; k < tr[this_tanker][j].bkt.num_of_entries; ++k)
            {
            printf("%d\t%d\t%s\n",t[j][k].chunk_offset,t[j][k].chunk_length,t[j][k].fing_print);
            (e).chunk_offset=t[j][k].chunk_offset;
            (e).chunk_length=t[j][k].chunk_length;
            strcpy((char*)((e).fing_print),(char*)t[j][k].fing_print);
            fwrite(e,sizeof(fpinfo),1,htfile);
            }
        } 
            fclose(htfile); 
         } 
        else 
        { 
            std::cout<<"File could not be opend for writing";
            printf("Error %d\t\n%s", errno,strerror(errno));
        }

    fclose(htfile);
    return 1;
}

1 个答案:

答案 0 :(得分:3)

fwrite()的第一个参数是const void*。这传递了struct fpinfo

fwrite(e, sizeof(fpinfo), 1, htfile);

更改为:

fwrite(&e, sizeof(fpinfo), 1, htfile);

我不确定struct fpinfo的成员是什么,所以这可能是不安全的(例如,如果它包含任何指针成员)。将来struct fpinfo中成员的任何重新排序或导致大小增加struct fpinfo的更改(如添加新成员)意味着任何尝试阅读以前写入的struct fpinfo数据都将是不正确的

e的声明更改为struct fpinfo* e;时,部分化错误是由于指针不是NULL或被分配给动态分配的struct fpinfo

当更改为struct fpinfo *e = NULL;时,当尝试访问e的任何成员时,这会导致分段错误,因为它未指向struct fpinfo