1

这与我对这个问题的回答的评论有关:如何将 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/

4

1 回答 1

0

比较这段代码:

int array[10][10];

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

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

于 2013-03-31T19:56:31.347 回答