如果可能,请使用 NSArray 或派生类。如果它必须是 C 数组,则可以使用单线性 malloc() 来完成,并自己对二维进行算术。IE
int *ar = malloc(sizeof(int) * nrows * ncols);
并通过偏移量的算术访问适当的“单元格”
// access cell at [n,m]
ar[n*ncols+m] = value;
我通常发现这比尝试管理指向值数组的指针数组要简单得多,但是您的里程可能会有所不同。
或者,我将其保存在最后,以防您希望多维动态数组中真正的“多”而不需要行-malloc-happy 列表最建议,并且您的 C 编译器支持 C99 标准中定义的称为 VLA(变量长度数组)。C99 在实现级别支持变量数组声明(即编译器可以支持标准定义的特性,但不是必须的;有关更多信息,请参见 C99 标准的 6.7.6.2)。如果你的编译器不支持它,那么一个预定义的宏,__STDC_NO_VLA__
必须定义并且可以在编译时进行测试(参见 C99 标准的第 6.10.8.3-1 节)。话虽这么说,我在过去十年中使用过的每个符合 C99 的编译器都支持它,所以如果你的不支持,请在下面的评论中告诉我们。对于 OP,如果您在 Xcode 中使用 gcc 或 llvm,我保证您会这样做。对于其他任何人,只需测试是否__STDC_NO_VLA__
已定义。如果不是,则支持该功能。
int nrows = 10, ncols = 15;
int (*ar)[cols] = malloc(sizeof(int) * nrows * ncols);
请立即注意几件事。分配与之前完全相同。然而,被声明的变量有点不同。这里的声明表明ar
它是一个指向ncols
整数数组的指针。只要您分配一个倍数ncols
(我们通过乘以nrows
),现在就可以使用您已经喜欢的熟悉的下标来访问结果矩阵:
// for any n'th row, m'th column
ar[n][m] = value;