Стек вокруг переменной был поврежден.

У меня есть функция, которая должна читать из файла, создавать структуру данных и возвращаться. функция работает, непосредственно перед линией возврата все выглядит хорошо, и структура выглядит нормально. но тогда функция терпит неудачу с-

«Ошибка проверки во время выполнения № 2 — стек вокруг переменной «выход» был поврежден».

Файл содержит информацию об электростанциях и городах (вывод, местоположение, название и т. Д.). Некоторые строки являются городами, а некоторые — электростанциями, которые отличаются последним целым числом в строке (или его отсутствием). если он существует (давайте назовем его X), эта линия — электростанция, а следующие X линий — города, связанные с ней.

эта функция должен создать указатель на указатели станций (станции **) со всеми городами, подключенными к каждой станции.

station** read_from_file(FILE *file , station **power_grid){

    int output  , cities_connected ,i, counter = 0 ,j =0;
    double x , y;
    char name[256] = {0};
    station *st;


    while (fscanf(file, "%*c%[^\"]%*c%lf%lf%lf%d\n", name, &output, &x, &y, &cities_connected) != EOF){
        counter++;
        for( i = 0; i < cities_connected; i++){
            fscanf(file , "%*c%[^\"]%*c%lf%lf%lf\n" , name , &output , &x ,&y);
        }
    }

    power_grid = (station **)malloc(sizeof(station *)* counter);

    rewind(file);

    while (fscanf(file, "%*c%[^\"]%*c%lf%lf%lf%d\n", name, &output, &x, &y, &cities_connected) != EOF)
    {
        st = (station *)malloc(sizeof(station));
        st->capacity = output;
        st->cities_list = NULL;
        st->num_of_cities = cities_connected;
        st->name = (char *)malloc(strlen(name));
        strcpy(st->name , name);
        st->location[0] = x;
        st->location[1] = y;

        st->cities_list = (city **)malloc(sizeof(city *)*cities_connected);

        for( i = 0; i < cities_connected; i++){
            fscanf(file , "%*c%[^\"]%*c%lf%lf%lf\n" , name , &output , &x ,&y);
            st->cities_list[i] = (city *)malloc(sizeof(city));
            st->cities_list[i]->consumption = output;
            st->cities_list[i]->location[0] = x;
            st->cities_list[i]->location[1] = y;
            st->cities_list[i]->name = (char *)malloc(strlen(name)+1);
            strcpy(st->cities_list[i]->name , name);
        }
        power_grid[j] = st;
        j++;
    }

    fclose(file);
    return;

}

станции и городские строения-

typedef struct city {
    char * name;
    double location[2];
    double consumption; 
}city;

typedef struct station {
    char * name;
    double location[2];
    city ** cities_list;
    int num_of_cities;
    double capacity;    
}station; 

Протестированный файл — здесь


person Liad Sagi    schedule 01.10.2017    source источник
comment
fscanf(file, "%*c%[^\"]%*c%lf%lf%lf%d\n", name, &output, : несоответствие типов. тип output - int.   -  person BLUEPIXY    schedule 01.10.2017
comment
@BLUEPIXY спасибо! это сработало! проблема была с типом вывода. (также добавлен один на st-›name malloc)   -  person Liad Sagi    schedule 01.10.2017


Ответы (1)


Ваши типы здесь не совпадают:

fscanf(file, "%*c%[^\"]%*c%lf%lf%lf%d\n", name, &output, ...

так как output объявлен как int, а вы используете %lf. Измените его на %d.

Более того, когда вы выделяете память для sr->name, вы не выделяете достаточно места для самого name и нулевого терминатора.

В результате измените это:

st->name = (char *)malloc(strlen(name));

к этому:

st->name = malloc(strlen(name) + 1);

Обратите внимание, что я не использовал то, что вернул malloc(), и вы тоже не должны (Приводить результат malloc?).

person gsamaras    schedule 01.10.2017