尝试分配2D数组后的EXC_BAD_ACCESS

时间:2014-11-08 22:08:58

标签: c malloc exc-bad-access

我正在为一所学校的项目工作,我正在尝试使用两个2D阵列。这是代码的一部分

int **matrice_prezent, **matrice_next;

尝试使用此位为两者分配内存:

*matrice_prezent = (int *)malloc((linii+2) * sizeof(int));
for(i = 0; i<linii+1; i++)
    matrice_prezent[i] = (int *)malloc((coloane+2) * sizeof(int));

*matrice_next = (int *)malloc((linii) * sizeof(int));
for(i = 0; i<linii; i++)
    matrice_next[i] = (int *)malloc((coloane) * sizeof(int));

第一部分很好,没有问题。但是,尝试对matrice_next执行相同的操作会导致此错误EXC_BAD_ACCESS。使用调试器(我正在使用Xcode btw,忘了提及)我看到代码的开头(int **matrice_prezent, **matrice_next),第一个地址有0x...,而后者有NULL

我理解这个错误意味着我试图使用不可用的内存(或者那些行中的内容)。我不确定这是否是我的错误(因为第一组malloc工作),或者我必须以某种方式迫使它工作。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

鉴于int **的定义,您应该按照以下步骤进行:

matrice_prezent = (int **)malloc((linii+2) * sizeof(int*));  // HEY *matrice_prezent is matrize_present[0] !!
assert (matrice_present != NULL);    // allways check memory allocation result
for(i = 0; i<linii+1; i++) {          // as previously 
    matrice_prezent[i] = (int *)malloc((coloane+2) * sizeof(int));
    assert (matrice_prezent[i] != NULL);   // really allways ! ;-)
    }

对于第二种方式,以与第一种方式相同的方式进行。如果你经常这样做,那么创建一个执行此操作的函数是值得的:

int** alloc2D (int lines, int cols) { /* ... */ }  

备注: 您可以考虑使用calloc()代替malloc(),因为它非常适合数组。此外,它将所有分配的元素设置为0.