为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
慕姐8265434 2019-06-10 20:25:24
如何正确地设置、访问和释放C中的多维数组?我在C中看到了许多关于多维数组的“我的代码出了什么问题”的问题。出于某种原因,人们似乎无法理解这里发生的事情,所以我决定回答这个问题,作为对其他人的引用:如何正确地设置、访问和释放C中的多维数组?如果其他人有用的建议,请随心所欲地张贴!
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

在C中,自C99以来,即使是动态多维数组也可以很容易地一次分配malloc被释放free:

double (*A)[n] = malloc(sizeof(double[n][n]));for (size_t i = 0; i < n; ++i)
  for (size_t j = 0; j < n; ++j)
      A[i][j] = someinvolvedfunction(i, j);free(A);


查看完整回答
反对 回复 2019-06-10
?
12345678_0001

TA贡献1802条经验 获得超5个赞

在C89中,至少有四种不同的方法来创建或模拟多维数组。

一个是“分开分配每一行”,迈克在他的回答中描述了这一点。它是多维数组,它只是模仿一个数组(特别是模仿访问元素的语法)。在每一行都有不同大小的情况下,它可能很有用,因此您不是表示矩阵,而是表示具有“粗糙边缘”的东西。

一个是“分配多维数组”。看起来是这样的:

int (*rows)[NUM_ROWS][NUM_COLS] = malloc(sizeof *rows);...free(rows);

那么访问元素[i,j]的语法是(*rows)[i][j]..在C89中,两者都是NUM_COLSNUM_ROWS必须在编译时知道。这是一个真正的二维数组rows是指向它的指针。

一个是“分配一个行数组”。看起来是这样的:

int (*rows)[NUM_COLS] = malloc(sizeof(*rows) * NUM_ROWS);...free(rows);

那么访问元素[i,j]的语法是rows[i][j]..在C 89中,NUM_COLS必须在编译时知道。这是一个真正的二维数组.

一种是,“分配一个一维数组并假装”。看起来是这样的:

int *matrix = malloc(sizeof(int) * NUM_COLS * NUM_ROWS);...free(matrix);

那么访问元素[i,j]的语法是matrix[NUM_COLS * i + j]..这个(当然)不是一个真正的二维数组.实际上,它的布局与一个相同。


查看完整回答
反对 回复 2019-06-10
  • 3 回答
  • 0 关注
  • 495 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信