如何正确地设置、访问和释放C中的多维数组?

如何正确地设置、访问和释放C中的多维数组?

我在C中看到了许多关于多维数组的“我的代码出了什么问题”的问题。出于某种原因,人们似乎无法理解这里发生的事情,所以我决定回答这个问题,作为对其他人的引用:

如何正确地设置、访问和释放C中的多维数组?

如果其他人有用的建议,请随心所欲地张贴!


慕姐8265434
浏览 496回答 3
3回答

慕哥6287543

在C中,自C99以来,即使是动态多维数组也可以很容易地一次分配malloc被释放free:double&nbsp;(*A)[n]&nbsp;=&nbsp;malloc(sizeof(double[n][n]));for&nbsp;(size_t&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;n;&nbsp;++i) &nbsp;&nbsp;for&nbsp;(size_t&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;n;&nbsp;++j) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[i][j]&nbsp;=&nbsp;someinvolvedfunction(i,&nbsp;j);free(A);

12345678_0001

在C89中,至少有四种不同的方法来创建或模拟多维数组。一个是“分开分配每一行”,迈克在他的回答中描述了这一点。它是不多维数组,它只是模仿一个数组(特别是模仿访问元素的语法)。在每一行都有不同大小的情况下,它可能很有用,因此您不是表示矩阵,而是表示具有“粗糙边缘”的东西。一个是“分配多维数组”。看起来是这样的:int&nbsp;(*rows)[NUM_ROWS][NUM_COLS]&nbsp;=&nbsp;malloc(sizeof&nbsp;*rows);...free(rows);那么访问元素[i,j]的语法是(*rows)[i][j]..在C89中,两者都是NUM_COLS和NUM_ROWS必须在编译时知道。这是一个真正的二维数组rows是指向它的指针。一个是“分配一个行数组”。看起来是这样的:int&nbsp;(*rows)[NUM_COLS]&nbsp;=&nbsp;malloc(sizeof(*rows)&nbsp;*&nbsp;NUM_ROWS);...free(rows);那么访问元素[i,j]的语法是rows[i][j]..在C 89中,NUM_COLS必须在编译时知道。这是一个真正的二维数组.一种是,“分配一个一维数组并假装”。看起来是这样的:int&nbsp;*matrix&nbsp;=&nbsp;malloc(sizeof(int)&nbsp;*&nbsp;NUM_COLS&nbsp;*&nbsp;NUM_ROWS);...free(matrix);那么访问元素[i,j]的语法是matrix[NUM_COLS * i + j]..这个(当然)不是一个真正的二维数组.实际上,它的布局与一个相同。
打开App,查看更多内容
随时随地看视频慕课网APP