2015-10-15 113 views
0

我已经创建了一个创建2d数组的程序。下面 代码工作以及在Visual Studio中&的Turbo C:使用双指针创建2d数组

#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个随机值),但在分配值时仍会偶尔崩溃。 为什么会发生这种情况?

回答

2

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

应该

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

(注意,中投不是在C and actually discouraged需要)

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

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

arr = calloc(row, sizeof*arr); 

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

+0

我知道。但它仍然不会改变它不工作的事实。 – hoholee12

+0

@ hoholee12它在我身边正常工作,没有泄漏检测 – vsoftco

+0

@PC Luddite的例子请。我在哪里可以在代码中找到UB? – hoholee12