删除锯齿状数组时出现分段错误

时间:2018-09-15 22:05:45

标签: c free

在创建锯齿状数组后,我试图将其释放,但是在尝试删除它时,遇到了分段错误的问题:

#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 :(得分:4)

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];

row [i] [j]的类型是整数类型,您正在使用,并将其分配给整数指针。这将执行的操作是释放行[i] [j]的值,而不是释放row [i] [j]的值,尝试释放该地址,该地址可能超出程序的地址空间,因此是不允许的,因此分割错误。

可行的合适方法是:

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