我正在为一所学校的项目工作,我正在尝试使用两个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
工作),或者我必须以某种方式迫使它工作。任何帮助将不胜感激!
答案 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.