Ошибка сегментации при удалении зубчатого массива - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь освободить неровный массив после его создания, но у меня возникает проблема с ошибкой сегментации, когда я пытаюсь его удалить:

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

int main(int argc, char *argv[]) {

    int *col;
    int **row;
    //Declare and fill col array 
    col = malloc(argc * sizeof (int));
    for (int k = 1; k < argc; k++) {
        col[k] = atoi(argv[k]);
    }
    row = malloc(argc * sizeof (int*));

    //build the ragged array
    for (int i = 0; i < argc; i++) {
        row[i] = malloc(sizeof (int) * col[i]);
        for (int j = 0; j < col[i]; j++) {
            row[i][j] = 1;
        }
    }

    //trying to delete it but its not working
    for (int i = 0; i < argc; i++) {
        for (int j = 0; j < col[i]; j++) {
            int* currentIntPtr = row[i];
            free(currentIntPtr);
        }
    }
    free(row);
    return 0;


}

Сообщение компилятора:

Segmentation fault (core dumped)

1 Ответ

0 голосов
/ 16 сентября 2018
row = malloc(argc * sizeof (int));

Это должно быть изменено на:

row = malloc(argc * sizeof (int *));

Поскольку вы выделяете новый целочисленный массив для каждого элемента в «строке» и, следовательно, каждый элемент в «строке» должен быть целочисленным указателем, чтобы он содержал адрес, который указывает на массив целых чисел.

Кроме того, вы освобождаете память неправильно.

for (int i = 0; i < argc; i++) {
    for (int j = 0; j < col[i]; j++) {
        int* currentIntPtr = row[i][j];
        free(currentIntPtr);
    }
}

Этот фрагмент кода не будет работать:.

int* currentIntPtr = row[i][j];

тип строки [i] [j] является целочисленным типом, и вы присваиваете его целочисленному указателю. Для этого вместо освобождения строки [i] [j] потребуется значение строки [i] [j], попытка освободить этот адрес, который может быть вне адресного пространства программы и, следовательно, не разрешен, и, следовательно, ошибка сегментации.

Соответствующее, которое будет работать, будет:

for (int i = 0; i < argc; i++) {
    int* currentIntPtr = row[i];
    free(currentIntPtr);
}
...