在创建锯齿状数组后,我试图将其释放,但是在尝试删除它时,遇到了分段错误的问题:
#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)
答案 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);
}