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