Как очистить 'ошибка сегментации (ядро сброшено)' в цикле while - PullRequest
0 голосов
/ 04 октября 2019

enter code here Это только часть моего кода, но после использования программы отладки я смог сузить, что ошибка сегментации происходит из-за доступа к i в цикле while.

Это входные данные:

30218294 Super Man 2.9
39324809 Spider Man 3.5
48201093 Papa Smurf 1.9
39482010 Mickey Mouse 3.2
49384832 Minnie Mouse 3.4
-1

Я попытался установить i = 0 перед циклом и изменить условия цикла while.

#include <stdio.h>
#include <cstring>
#include <string.h>
#include <stdlib.h>

struct student{
    char fname[100];
    char lname[100];
    int euid;
    float gpa;
};

/* Reads the data from a file and stores it in the array of structs */
void readData(struct student *db, int *size)
{
    const char* file_name = "input";

    FILE *infile;
    infile=fopen(file_name,"r");

    int i=0, euid;
    fscanf(infile,"%d",&euid);
    while(euid > 0){
        db[i].euid = euid; //**ERROR: Segmentation Fault**
        fscanf(infile,"%s%s%f%d",db[i].fname,db[i].lname,&db[i].gpa,&euid);
        i++;
    }
    fclose(infile);
    *size = i;
}

int main(void)
{

    int size;
    struct student* db[100];

    /* read info from file */
    readData(*db,&size);

    return 0;
}

Программа получила сигнал SIGSEGV, Ошибка сегментации. 0x00400729 в ​​readData (дБ = 0xb7fe173d, размер = 0xbffff278) на func.c: 17 17 дБ [i] .euid = euid;

1 Ответ

2 голосов
/ 05 октября 2019

В этой программе

int main(void)
{

    int size;
    struct student* db[100];

    /* read info from file */
    readData(*db,&size);

    return 0;
}

*db эквивалентно db[0], поэтому значение неинициализированного указателя передается в readData.

Для чтения в массив, статически размещенный вmain, программа должна выглядеть следующим образом:

int main(void)
{

    int size;
    /* allocate array of the struct, not array of "pointer to" the struct */
    struct student db[100];

    /* read info from file */
    /* remove "*" so that the pointer to the first element will be passed */
    readData(db,&size);

    return 0;
}

Добавление проверок успешности fopen и fscanf сделает вашу программу еще лучше.

...