我得到一个奇怪的“Segmentation fault:11”这个简单的代码,无法弄清楚是什么问题。我只需要使用size nrows x ncolumns动态声明和数组。
#include <stdlib.h>
#include <stdio.h>
int main()
{
int nrows = 3;
int ncolumns = 5;
int **array;
array = calloc(nrows, sizeof(int));
for(int i = 0; i < nrows; i++)
{
array[i] = calloc(ncolumns, sizeof(int));
if(array[i] == NULL)
{
fprintf(stderr, "out of memory\n");
exit(-1);
}
}
for(int i = 0; i < nrows; i++)
{
for(int j = 0; j < ncolumns; j++)
{
array[i][j] = 10;
printf("%d %d: %d\n",i,j, array[i][j]);
}
}
return 0;
}
答案 0 :(得分:4)
你正在混淆你的比喻。您声明您的数组是一个指针块,但随后分配int
大小的内存块。你可能只是逃避这里指针的大小是一个int的大小,但它仍然是不正确的。
最简单的选择是使它成为一个简单的一维数组,您可以使用行和列步长(即array[row*ncolumns + column]
)进行访问,或者在整个过程中更彻底地使用指针。
请注意,您不能使用doubled up数组语法来访问这种动态分配的2D数组,因为编译器不知道内部数组的大小,因此,外部数组的步幅。 / p>