我并不真正理解C中的一些基本东西,比如动态分配数组的数组。我知道你能做到:
int **m;
以便声明一个二维数组(随后将使用某个*alloc函数进行分配)。此外,可以通过执行*(*(m + line) + column)
“轻松”访问它。但是我应该如何给该数组中的元素赋值呢?使用gcc,下面的语句m[line][column] = 12;
失败,出现分段错误。
任何文章/文档都将不胜感激。:-)
发布于 2009-01-18 21:53:54
您的语法mline是正确的。但是为了在C中使用二维数组,你必须为它分配内存。例如,此代码将为给定行和列的表分配内存。
int** AllocateArray(int line, int column) {
int** pArray = (int**)malloc(line*sizeof(int*));
for ( int i = 0; i < line; i++ ) {
pArray[i] = (int*)malloc(column*sizeof(int));
}
return pArray;
}
注意,为了简洁起见,我省略了malloc的错误检查。一个真正的解决方案应该包括它们。
发布于 2009-01-18 21:57:55
它不是二维数组--它是一个数组的数组--因此它需要多次分配。
发布于 2009-01-18 23:09:47
尽管我同意其他答案,但在大多数情况下,一次分配整个数组更好,因为malloc相当慢。
int **
array_new(size_t rows, size_t cols)
{
int **array2d, **end, **cur;
int *array;
cur = array2d = malloc(rows * sizeof(int *));
if (!array2d)
return NULL;
array = malloc(rows * cols * sizeof(int));
if (!array)
{
free(array2d);
return NULL;
}
end = array2d + rows;
while (cur != end)
{
*cur = array;
array += cols;
cur++;
}
return array2d;
}
要释放数组,只需执行以下操作:free(*array); free(array);
注意:只有当您不想更改行的顺序时,此解决方案才有效,因为您可能会丢失第一个元素的地址,您需要它稍后释放数组。
https://stackoverflow.com/questions/455960
复制相似问题