Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的多维数组_C_Arrays_Memory Management_Multidimensional Array - Fatal编程技术网

C语言中的多维数组

C语言中的多维数组,c,arrays,memory-management,multidimensional-array,C,Arrays,Memory Management,Multidimensional Array,这与我对这个问题的回答有关: ,请考虑这个片段: 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+

这与我对这个问题的回答有关:

,请考虑这个片段:

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);
intm=5;
int N=5;
int**theArray=(int**)malloc(M*sizeof(int*);
for(int i=0;i
我得说,它在我的机器上运行得非常好,但我在评论中被告知,这纯粹是运气,声明二维数组是错误的,内存应该只分配1个malloc来获得连续内存

我真的很困惑,因为我认为C中的非动态多维数组的工作方式完全相同:它们基本上是指针数组,其中每个值都是数组

问题是,这样做是否正确(便携式、通用做法等)?我错过了这个话题吗?我的意思是,我真的看不出这个代码有什么问题

编辑:

我最终从WhozCraig和Daniel Fischer的评论中得到了答案。我的主要错误是,我假设数组和指针比实际情况更相似

主要原因是实际多维数组存储在线性内存()中的行主顺序。为了理解真实多维数组和我的snipppet之间的实际区别,我建议阅读本文(这篇文章对我的主题进行了很好的澄清,并提供了易于理解的示例):

第1部分:

第2部分:

比较此代码:

int array[10][10];

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

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

您认为非动态多维数组与指向数据指针的指针同义的前提是完全不正确的。也就是说,只要数组从未传递给声明接受类似于
int ar[][N]
的参数的函数,代码就可以了。他们肯定不一样。有几篇优秀的文章讨论了C/C++中的多维数组工作。我会尽力追捕他们,但建议你也这样做。他们中的一些人在他们的ascii艺术视觉方面是惊人的。你的代码很好,但你分配的不是多维数组。所以,关键是代码是正确的,但从技术上讲,它只是作为“接口”的多维数组,但它不是真正的多维数组,对吗?谢谢你的回答,我要去读指针和数组之类的东西,似乎我对这个主题的认识是错误的:)我认为第一篇文章对你来说是老新闻。但是第二个很好地解释了如何使用指针对指针在C中模拟多维数组。请注意,
int**
方法确实提供了真正的多维数组所没有的一点,那就是可变的行宽。并非所有行都必须使用与您类似的代码具有相同的宽度(显然,您最好知道在这方面您在做什么)。另外,尽管那篇文章最后只简单地介绍了它,
int(*ar)[N]
也很常见,我建议写一些代码来看看它们是如何工作的。是的,我知道非动态分配的数组在内存中是连续的。问题是,有人告诉我,我的代码是完全不正确的,结果是错误的——从技术上讲,这不是一个多维数组(也许我把问题中的注释搞错了,也许他是认真的)。从WhozCraig和Daniel Fischer对这个问题的评论中得到的。@StanmgGeek-你的代码要么正确,要么完全不正确,这取决于你想用它做什么:)如果你把它当作多维数组处理,在很多情况下你会得到一个segfault,在其他情况下就可以了。