处理struct数组时出现分段错误

时间:2012-04-13 18:50:50

标签: c

我创建了一个结构,它有自己的id号,值和状态。 我有一个由数据组成的文件(1 199 0 2 199 1 ...)1它的数字,199是值,0是状态并继续这样... 我使用了一个名为filldata()的函数来一次读取3个数字,例如,1 199 0然后将它放入结构数组的传递元素中。 然后,我使用另一个函数来调用this函数来填充struct数组。 fillAll函数将返回已从文件复制到struct数组的数据集 但我收到了分段错误。知道为什么吗? 代码解释得更好:

int filldata(struct Data_point *a, const char *filelocation)  
    {

        FILE *f;
        if((f=fopen(filelocation,"r"))==NULL)
            printf("You cannot open");

        if( fscanf(f, "%ld%lf%d", &(a->sampleNumber), &(a->value), &(a->status)) == 3)
            return 1;   
        else
            return 0;
    }

    int fillAll(struct Data_point *a, const char *filelocation)// I will pass the struct array and the location of my file string
    {
        int index=0;
        while(filldata(&a[index], filelocation))
            index++;

        return index;
    }

2 个答案:

答案 0 :(得分:2)

您反复打开文件名filelocation但从未关闭文件句柄f。你会一遍又一遍地阅读第一行并最终耗尽文件句柄。

您可以更改filldata以获取文件指针,检查我添加的下面的代码段 一些额外的检查,你还需要检查size of Data_point *a是否在 填写时分配范围

int filldata(struct Data_point *a, File *f) 


    if( fscanf(f, "%ld%lf%d", &(a->sampleNumber), &(a->value), &(a->status)) == 3)
        return 1;   
    else
        return 0;
}

int fillAll(struct Data_point *a, const int data_point_size,const char *filelocation)// I will pass the struct array and the location of my file string
{

    FILE *f;
    if((f=fopen(filelocation,"r"))==NULL) {
        printf("You cannot open");
       return 0;
    }


    int index=0;
    while(index < data_point_size &&  filldata(&a[index]))  {
        index++;
    } 
    fclose(f);
    return (index != data_point_size);
 }

答案 1 :(得分:0)

由于你的while循环,你正在获得分段错误。它将永远停止,直到filldata返回0.在此之前,你的程序在传递&amp; a [index]时已经越过数组边界。此外,我相信不能保证filldata会返回0,因为程序将首先尝试访问fscanf()中的超出内存,从而导致运行时错误或获取垃圾值并将其视为成功。

如果我错了,请纠正我。