C中的多维数组

这与我在这个问题中的答案的评论有关: 如何从1d中转出2d数组?

所以,请考虑以下代码段:

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 )。 为了理解真正的多维数组和我的snipppet之间的实际差异,我建议阅读这篇文章(它为我做了很好的澄清,并提供了易于理解的例子):

第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/

比较这段代码:

 int array[10][10]; for (int i = 0; i < 10 * 10; i++) { *((int *)array+i) = 0; } 

这对于二维数组来说很好,因为所有内存都是连续的。 使用您的版本,您有一组连续的指针,每个指针都可以指向内存中的任何位置。