Создание массива строк динамически в C - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующий код C на Ubuntu 18.04:

#define ID_LEN 5

int main(int argc, char *argv[])
{
    int variableNumberOfElements = 5;
    char **orderedIds;

    *orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));
    for (int i = 0; i < variableNumberOfElements; i++)
        orderedIds[i] = (char *) malloc((ID_LEN+1) * sizeof(char));


    for (int i = 0; i < variableNumberOfElements; i++)
        free (orderedIds[i]);

    free(*orderedIds);
    return 0;
}

Я строю этот код следующим образом:

g++ -g mymain.c

когда я запускаю эту программу, в строке

появляется сообщение об ошибке «Ошибка сегментации (сброшено ядро)»
*orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));

В чем проблема?

UPDATE:

Правильный способ выделения памяти: orderIds = (char **) malloc (variableNumberOfElements * sizeof (char *));

и: Свободный (orderedIds);

Спасибо

1 Ответ

0 голосов
/ 15 ноября 2018

В то время, когда вы делаете это:

*orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));

orderedIds не инициализируется, поэтому его значение равно неопределено . Затем вы пытаетесь разыменовать это неопределенное значение. Это вызывает неопределенное поведение .

Вы хотите назначить orderedIds напрямую:

orderedIds = malloc(variableNumberOfElements * sizeof (char*));

Затем вы можете дополнительно назначить память, выделенную malloc, для элементов выделенного вами массива.

У вас похожая проблема с free:

free(*orderedIds);

*orderedIds - это то же самое, что orderedIds[0], который вы уже освободили, так что это двойное освобождение. Это также вызывает неопределенное поведение. Вместо этого вы должны иметь:

free(orderedIds);
...