正是在这个问题涉及到的意见对我的回答:How to turn 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);
我得说,这工作完全正常我的机器上,但我在评论中被告知,这是纯粹的运气,并且声明2维数组是错误的方法,应该只用1个malloc来分配内存以获取连续的内存。
我真的很困惑,因为我认为C中的非动态多维数组的工作方式完全相同:它们基本上是一个指针数组,其中每个值都是一个数组。
问题是,这是正确的(便携式,普遍的做法等)的方式来做到这一点?我错过了这个话题?我的意思是,我真的没有看到这个代码有任何问题。
编辑:
我,我终于从WhozCraig和丹尼尔·菲舍尔评论了解答案。我的主要错误是我认为数组和指针比实际更相似。
主要原因是实际多维数组存储在线性存储器中的行优先顺序(http://en.wikipedia.org/wiki/Row-major_order)。而要了解真正的多维数组和我snipppet我建议您阅读这篇文章之间的实际差异(这让这个话题对于我和provdes容易不错澄清理解的例子):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/
你的前提是非动态多维数组与指向数据指针的指针是同义的,这完全不正确。也就是说,只要'theArray'永远不会传递给声明接受类似于'int ar [] [N]'的参数的函数,您的代码就没有问题。他们肯定不是*相同。有几个**杰出的**帖子讨论了C/C++中的多维数组工作。我会尽力狩猎他们,但建议你也这样做。他们中的一些人在他们的ascii艺术视觉效果中惊人* P – WhozCraig
WhozCraig说的。你的代码很好,但你分配的不是一个多维数组。 –
所以,重点是代码是正确的,但从技术上讲,它只是多维数组作为“接口”,但它不是真正的多维数组,对吗?感谢您的答案,会去阅读像指针与数组一样的东西,看起来像我在这个主题上的知识是错误的:) –