这与我对这个问题的回答的评论有关:如何将 2d array out of 1d one?
所以,考虑这个片段:
int M = 5;
int N = 5;
int** theArray = (int**) malloc(M*sizeof(int*));
for (int i = 0; i < M; i++)
{
theArray[i] = (int*) malloc(N*sizeof(int));
for(int j = 0 ; j < N; j++)
{
theArray[i][j] = i+j;
printf("%d ", theArray[i][j]);
}
printf("\n");
}
for (int k = 0; k < M; k++)
{
free(theArray[k]);
}
free(theArray);
我得说它在我的机器上工作得非常好,但我在评论中被告知这纯粹是运气,声明二维数组的方法是错误的,应该只用 1 个 malloc 分配内存以获得连续内存。
我真的很困惑,因为我认为 C 中的非动态多维数组的工作方式完全相同:它们基本上是一个指针数组,其中每个值都是一个数组。
问题是,这样做是否正确(便携式、常见做法等)方式?我错过了有关此主题的内容吗?我的意思是,我真的看不出这段代码有什么问题。
编辑:
我从 WhozCraig 和 Daniel Fischer 的评论中得到了我终于明白的答案。我的主要错误是我认为数组和指针比实际更相似。
主要原因是实际多维数组存储在线性内存中的行优先顺序(http://en.wikipedia.org/wiki/Row-major_order)。为了理解真正的多维数组和我的片段之间的实际区别,我建议阅读这篇文章(它对我来说很好地阐明了这个主题,并提供了易于理解的示例):
第 1 部分:http ://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c/
第 2 部分:http ://eli.thegreenplace.net/2010/04/06/pointers-vs-arrays-in-c-part-2d/