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 将失败