【发布时间】:2011-11-11 16:43:18
【问题描述】:
我担心可变长度数组。当我想动态分配一个数组时,如果无法分配足够的内存,我会得到 null,我可以在我的程序中正确响应。使用可变长度数组我没有得到这个信息。我该怎么办?
【问题讨论】:
-
和
alloca一样安全
我担心可变长度数组。当我想动态分配一个数组时,如果无法分配足够的内存,我会得到 null,我可以在我的程序中正确响应。使用可变长度数组我没有得到这个信息。我该怎么办?
【问题讨论】:
alloca一样安全
你说得对,VLA 基本上总是不安全的。唯一的例外是,如果您确保永远不会使它们大于某个大小,您会觉得制作一个固定大小的数组是安全的,在这种情况下,您不妨只使用一个固定大小的数组。有一类晦涩难懂的递归算法,其中 VLA 可能会在无法解决问题(堆栈溢出)和能够解决问题之间产生差异,但在大多数情况下,我建议永远不要使用 VLA。
但这并不意味着 VLA 类型没有用处。虽然 VLA 不好/危险,但 pointer-to-VLA 类型非常有用。它们使动态分配(通过malloc)多维数组成为可能,而无需手动进行维数运算,如下所示:
size_t n;
double (*matrix)[n] = malloc(n * sizeof *matrix);
得到一个可寻址为matrix[i][j]的n×n矩阵。
【讨论】:
n*n 矩阵分配内存以获取指向n doubles 数组的指针?
n),因此您需要指向 @987654328 的指针@。对malloc 的调用为n 这样的数组分配空间(sizeof *matrix 给出了一个这样的数组的大小),所以你最终得到一个指向ndouble[n] 对象数组的第一个元素的指针 - - 一个二维数组。