C语言中的多维数组



这与我在这个问题上的回答有关:如何将2d数组变为1d数组?

那么,考虑下面的代码片段:

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)。为了理解真正的多维数组和我的代码片段之间的实际区别,我建议阅读这篇文章(它对我这个主题做了很好的澄清,并提供了易于理解的示例):

第一部分:http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c/

第二部分: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;
}

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

相关内容

  • 没有找到相关文章

最新更新