gpt4 book ai didi

C: free() for row of 2d int array 使程序停止

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:28 25 4
gpt4 key购买 nike

我是 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;
}

第二个在第一个中使用,用于为行 vector 分配必要的内存:

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 , 或 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?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() 使用此赋值覆盖该分配
结果[i] = &array[i * m];
导致内存泄漏。如果 array 是 free(),那么尝试 free() result 将失败

关于C: free() for row of 2d int array 使程序停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30491372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com