Ошибка сегментации при попытке записи в структуру - PullRequest
1 голос
/ 11 июля 2019

Я новичок в C, и я пытаюсь написать простую программу расписания.У меня есть комнаты, и я хочу заполнить их событиями.

static void create_dummy_data() 
{

    #define max_entries 5

    struct event
    {
        char *event_name;
        int duration_min; // duration in minutes 
    };

    struct room
    {
        char *room_name;
        struct event *events[10];
    };

    int i = 0;
    char *names[] = {"Room1", "Room2", "Room3", "Room4", "Room5", "Room6"};

    struct room *rooms[max_entries];

    for ( i = 0; i < max_entries ; i++)
    {
        rooms[i]->room_name = names[i];  // The problem is here
    }

}

Я получаю сообщение об ошибке "Ошибка сегментации 8263 (ядро сброшено)" *

1 Ответ

3 голосов
/ 11 июля 2019

Когда вы объявляете struct room *rooms[max_entries];, у вас в сегменте данных будет массив max_entries указателей, которые инициализированы в NULL.

Поскольку вы не выделяете память для своей комнаты, это означает, что когда вы пишете rooms[i]->room_name, вы по существу сделали то же самое, что и NULL->room_name.Механизм защиты памяти вашей системы обнаруживает, что вы хотите получить доступ к части памяти, которая не разрешена, и сигнализирует вам об ошибке сегментации.

Вы должны добавить:

 rooms[i] = malloc(sizeof (struct room));
 if(!rooms[i]) exit(EXIT_FAILURE);  // example error handling, can be different

к вашему циклу.

Кстати: это использование в C для определения макросов во всех заглавных буквах, так что сразу видно, что это макрос.Поэтому вы должны использовать

#define MAX_ENTRIES 5

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...