使用双指针创建二维数组

标签 c arrays pointers

我制作了一个创建二维数组的程序。 下面的代码在 visual studio 和 turbo c 上运行良好:

#include<stdio.h>
#include<stdlib.h>


int **allocarr(int **arr, int row, int col){
    int i;
    arr=calloc(row, sizeof(int));
    for(i=0; i<row; i++){
        arr[i]=calloc(col, sizeof(int));


    }

    return arr;
}

void freearr(int **arr, int row, int col){
    int i;
    for(i=0; i<row; i++) free(arr[i]);
    free(arr);


}

void printarr(int **arr, int row, int col){
    int i, j;
    for(i=0; i<row; i++){
        for(j=0;j<col;j++){
            printf("\t%d", arr[i][j]);
        }
        printf("\n\n");
    }


}



int main(){
    int **arr=NULL;
    arr=allocarr(arr, 3, 3);
    arr[2][2]=8;
    printarr(arr, 3, 3);
    freearr(arr,3, 3);
    return 0;
}

但它不适用于 mac os x gcc 和 mingw gcc。 一切都可以正常编译,没有任何警告和错误(-Wall & -Wextra), 但它在运行时崩溃...... 在 gdb 和 lldb 中,它表示 free() 正在释放未分配的内存。

分配一个指针数组后,当我在那之后分配内存时,正好有 2 个内存块(这个词正确吗?)将具有无法初始化的随机值。

在将它分配给指针数组之前,我尝试分配另一个数组。 它打印正常(没有 2 个随机值),但在为其分配值时仍会偶尔崩溃。 为什么会这样?

最佳答案

这个

arr=(int **)calloc(row, sizeof(int));

应该是

arr = calloc(row, sizeof(int*));

(注意在 C and actually discouraged 中不需要转换)

因此,在指针大小不是 int 大小的实现中(例如在 x64 机器上),当您在分配的内存范围之外读取时,您将调用未定义的行为。

您可能会考虑不使用显式类型作为 sizeof 的操作数。

arr = calloc(row, sizeof*arr);

这可以让编译器推断出类型,并帮助您避免这样的错误。

关于使用双指针创建二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33138165/

相关文章:

Java - 将文件中的数据存储到数组中

c++ - 如何从列表中删除一个元素?

c - 从文件中读取 MKL_INT 时的特殊行为

c - c编程中的指针

javascript - 修复比较零和负数 javascript

与 char* 冲突的类型

c++ - 从静态函数调用非静态变量

c - 在 Doxygen 中记录没有扩展名的文件

c++ - 这个独特的字符串函数的执行时间是否从天真的 O(n^2) 方法中减少了?

vb.net - 将基数 1 数组更改为基数 0 数组