2013-03-31 100 views
1

正是在这个问题涉及到的意见对我的回答: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/

+5

你的前提是非动态多维数组与指向数据指针的指针是同义的,这完全不正确。也就是说,只要'theArray'永远不会传递给声明接受类似于'int ar [] [N]'的参数的函数,您的代码就没有问题。他们肯定不是*相同。有几个**杰出的**帖子讨论了C/C++中的多维数组工作。我会尽力狩猎他们,但建议你也这样做。他们中的一些人在他们的ascii艺术视觉效果中惊人* P – WhozCraig

+4

WhozCraig说的。你的代码很好,但你分配的不是一个多维数组。 –

+0

所以,重点是代码是正确的,但从技术上讲,它只是多维数组作为“接口”,但它不是真正的多维数组,对吗?感谢您的答案,会去阅读像指针与数组一样的东西,看起来像我在这个主题上的知识是错误的:) –

回答

0

比较此代码:

int array[10][10]; 

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

这是对细的二维阵列,因为所有的存储器的是连续的。使用你的版本,你有一组连续的指针,每一个都可以指向内存中的任何地方。

+0

是的,我知道非动态分配的数组在内存中是连续的。事情是,我被告知,我的代码是完全不正确的,结果是错误的 - 这在技术上并不是一个多维数组(可能我在链接问题中给了评论者错误的,也许他的意思)。从WhozCraig和Daniel Fischer对此问题的评论中得知。 –

+0

@StanMcGeek - 你的代码要么是正确的,要么是完全不正确,取决于你想用它做什么:)如果你把它当作一个多维数组,在很多情况下你会得到一个段错误,在其他情况下它会没事的。 – teppic