C: free() for row of 2d int array 使程序停止
C: free() for row of 2d int array makes program halt
我是 C 语言的新手,编写了(或更准确地说:从 here 复制并改编)了以下函数。第一个采用 numpy 数组并将其转换为 C int 数组:
int **pymatrix_to_CarrayptrsInt(PyArrayObject *arrayin) {
int **result, *array, *tmpResult;
int i, n, m, j;
n = arrayin->dimensions[0];
m = arrayin->dimensions[1];
result = ptrvectorInt(n, m);
array = (int *) arrayin->data; /* pointer to arrayin data as int */
for (i = 0; i < n; i++) {
result[i] = &array[i * m];
}
return result;
}
第二个在第一个中使用,用于为行向量分配必要的内存:
int **ptrvectorInt(long dim1, long dim2) {
int **result, i;
result = malloc(dim1 * sizeof(int*));
for (i = 0; i < dim1; i++) {
if (!(result[i] = malloc(dim2 * sizeof(int)))){
printf("In **ptrvectorInt. Allocation of memory for int array failed.");
exit(0);
}
}
return result;
}
到目前为止一切正常。现在我想释放 C 数组占用的内存。我发现了多个关于如何做的话题,例如Allocate and free 2D array in C using void, C: Correctly freeing memory of a multi-dimensional array, or how to free c 2d array。受各自答案的启发,我写了我的释放函数:
void free_CarrayptrsInt(int **ptr, int i) {
for (i -= 1; i >= 0; i--) {
free(ptr[i]);
}
free(ptr);
}
尽管如此,我发现 free
的第一次调用已经失败了——无论我是让 for 循环向下还是向上。
我在寻找 free
命令失败的解释:Can a call to free() in C ever fail? and free up on malloc fails。这表明,内存分配可能已经存在问题。但是,我的程序完全按预期工作 - 除了内存释放。打印 respected 数组表明一切都应该没问题。可能是什么问题?更重要的是:如何正确释放阵列?
我在使用 Visual Studio 10 64 位编译器的 Win8 64 位机器上工作。我将 C 与 python 3.4 64 位一起使用。
感谢大家的帮助!
pymatrix_to_CarrayptrsInt()
调用 ptrvectorInt()
并进行此分配
if (!(result[i] = malloc(dim2 * sizeof(int)))){
然后 pymatrix_to_CarrayptrsInt()
使用此赋值覆盖该分配
result[i] = &array[i * m];
导致内存泄漏。如果 array
是 free(),那么尝试 free() result
将失败
我是 C 语言的新手,编写了(或更准确地说:从 here 复制并改编)了以下函数。第一个采用 numpy 数组并将其转换为 C int 数组:
int **pymatrix_to_CarrayptrsInt(PyArrayObject *arrayin) {
int **result, *array, *tmpResult;
int i, n, m, j;
n = arrayin->dimensions[0];
m = arrayin->dimensions[1];
result = ptrvectorInt(n, m);
array = (int *) arrayin->data; /* pointer to arrayin data as int */
for (i = 0; i < n; i++) {
result[i] = &array[i * m];
}
return result;
}
第二个在第一个中使用,用于为行向量分配必要的内存:
int **ptrvectorInt(long dim1, long dim2) {
int **result, i;
result = malloc(dim1 * sizeof(int*));
for (i = 0; i < dim1; i++) {
if (!(result[i] = malloc(dim2 * sizeof(int)))){
printf("In **ptrvectorInt. Allocation of memory for int array failed.");
exit(0);
}
}
return result;
}
到目前为止一切正常。现在我想释放 C 数组占用的内存。我发现了多个关于如何做的话题,例如Allocate and free 2D array in C using void, C: Correctly freeing memory of a multi-dimensional array, or how to free c 2d array。受各自答案的启发,我写了我的释放函数:
void free_CarrayptrsInt(int **ptr, int i) {
for (i -= 1; i >= 0; i--) {
free(ptr[i]);
}
free(ptr);
}
尽管如此,我发现 free
的第一次调用已经失败了——无论我是让 for 循环向下还是向上。
我在寻找 free
命令失败的解释:Can a call to free() in C ever fail? and free up on malloc fails。这表明,内存分配可能已经存在问题。但是,我的程序完全按预期工作 - 除了内存释放。打印 respected 数组表明一切都应该没问题。可能是什么问题?更重要的是:如何正确释放阵列?
我在使用 Visual Studio 10 64 位编译器的 Win8 64 位机器上工作。我将 C 与 python 3.4 64 位一起使用。
感谢大家的帮助!
pymatrix_to_CarrayptrsInt()
调用 ptrvectorInt()
并进行此分配
if (!(result[i] = malloc(dim2 * sizeof(int)))){
然后 pymatrix_to_CarrayptrsInt()
使用此赋值覆盖该分配
result[i] = &array[i * m];
导致内存泄漏。如果 array
是 free(),那么尝试 free() result
将失败