【问题标题】:creating a 2d array using double pointer使用双指针创建二维数组
【发布时间】:2015-10-15 01:09:09
【问题描述】:

我制作了一个创建二维数组的程序。 下面的代码在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 个随机值),但在为其分配值时仍会偶尔崩溃。 为什么会这样?

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    这个

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

    应该是

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

    (请注意,C and actually discouraged 中不需要强制转换)

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

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

    arr = calloc(row, sizeof*arr);
    

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

    【讨论】:

    • 我知道。但它仍然不能改变它不起作用的事实。
    • @hoholee12 它在我这边工作正常,没有检测到泄漏
    • @PC Luddite 示例。我在哪里可以找到代码中的 UB?
    • @hoholee12我认为这应该纠正错误。您确定将sizeof(int) 更改为sizeof(int*)
    • @hoholee12 每当您读取或写入arr 的上索引时,您都会调用未定义的行为。当sizeof(int*) &gt; sizeof(int) 时,您没有在arr 中分配足够的内存来存储所有int*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多