使用可变长度数组是不是安全?

Posted

技术标签:

【中文标题】使用可变长度数组是不是安全?【英文标题】:Is it safe to use variable-length arrays?使用可变长度数组是否安全? 【发布时间】:2011-11-11 16:43:18 【问题描述】:

我担心可变长度数组。当我想动态分配一个数组时,如果无法分配足够的内存,我会得到 null,我可以在我的程序中正确响应。使用可变长度数组我没有得到这个信息。我该怎么办?

【问题讨论】:

alloca一样安全 【参考方案1】:

你说得对,VLA 基本上总是不安全的。唯一的例外是,如果您确保永远不会使它们大于某个大小,您会觉得制作一个固定大小的数组是安全的,在这种情况下,您不妨只使用一个固定大小的数组。有一类晦涩难懂的递归算法,其中 VLA 可能会在无法解决问题(堆栈溢出)和能够解决问题之间产生差异,但在大多数情况下,我建议永远不要使用 VLA。

但这并不意味着 VLA 类型没有用处。虽然 VLA 不好/危险,但 pointer-to-VLA 类型非常有用。它们使动态分配(通过malloc)多维数组成为可能,而无需手动进行维数运算,如下所示:

size_t n;
double (*matrix)[n] = malloc(n * sizeof *matrix);

得到一个可寻址为matrix[i][j]的n×n矩阵。

【讨论】:

我从来没有真正考虑过为此使用 VLA-casts。我一直认为它会一成不变。 您如何为n*n 矩阵分配内存以获取指向n doubles 数组的指针? @hacks:动态分配数组时,您希望指针类型与数组元素的类型相匹配,因为它将指向第一个元素。 (请注意,这与数组衰减到的类型相同。)在二维数组的情况下,其元素是特定长度的一维数组(此处为 n),因此您需要指向 @987654328 的指针@。对malloc 的调用为n 这样的数组分配空间(sizeof *matrix 给出了一个这样的数组的大小),所以你最终得到一个指向ndouble[n] 对象数组的第一个元素的指针 - - 一个二维数组。 @R..;感谢您的澄清。阅读您的答案后,我考虑了一下,终于明白了,但忘了删除评论:P 注意:“VLA 类型”的正确术语是可变修改类型

以上是关于使用可变长度数组是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

将 alloca() 用于可变长度数组是不是比在堆上使用向量更好?

通过过度分配内存在结构中内联可变长度数组是不是有效?

为啥我可以进入 alloca:d 变量的范围,而不是可变长度数组?

用于可变长度参数数组的 PHPDoc

scala数据结构与可变不可变

在 C++ 中声明可变长度二维数组的正确方法