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

Segmentation fault while deleting jagged array

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

#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)
row = malloc(argc * sizeof (int));

这应该改为:

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

因为您正在为 "row" 中的每个元素分配一个新的整数数组,因此,"row" 中的每个元素都必须是一个整数指针,以便它保存指向数组的地址整数。

此外,您释放内存的方式不对。

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] 的类型是整数类型,而您是并且正在将其分配给整数指针。这将做的不是释放 row[i][j],而是获取 row[i][j] 的值,尝试释放可能超出程序地址 space 的地址,因此是不允许,因此出现分段错误。

合适的是:

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