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

17

我对可变长度数组有些担忧。当我想要动态分配一个数组时,如果无法分配足够的内存,我会得到空值,并且可以在程序中正确地响应此问题。但是对于可变长度数组,我无法获得这些信息。我该怎么处理?


2
它和alloca一样安全。 - phuclv
1个回答

41

您是正确的,VLA基本上总是不安全的。唯一的例外是如果您确保它们永远不会比您认为安全的固定大小数组更大,那么在这种情况下,您可能会想直接使用固定大小数组。有一类晦涩难懂的递归算法,其中VLA可能成为无法解决问题(堆栈溢出)和能够解决问题的区别所在,但在大多数情况下,我建议永远不要使用VLA。

但这并不意味着VLA类型是无用的。虽然VLA不好/危险,但指向VLA的指针类型非常有用。它们使得可以拥有动态分配(通过 malloc)的多维数组,而不需要手动进行维度计算,例如:

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

想要获取一个可以通过matrix[i][j]方式访问的 n × n 矩阵。


7
我从未真正考虑过使用VLA强制类型转换来完成这个。我一直认为它会很固定。 - Chris Lutz
1
你是如何为一个指向n个双精度数组的指针分配n*n矩阵的内存的? - haccks
4
在动态分配数组时,希望指针类型与数组元素的类型匹配,因为它将指向第一个元素。(请注意,这是数组衰减后的相同类型。)在二维数组的情况下,其元素是特定长度(此处为 n)的一维数组,因此需要一个指向 double[n] 的指针。调用 malloc 分配了空间来存储 n 个这样的数组(sizeof *matrix 给出了一个这样的数组的大小),因此你最终得到了一个指向 ndouble[n] 对象的数组的第一个元素的指针——即一个二维数组。 - R.. GitHub STOP HELPING ICE
@R..; 感谢你的澄清。在阅读了你的回答后,我仔细思考了一下,最终明白了,但是忘记删除评论了 :P - haccks
注意:“VLA类型”的正确术语是可变修改类型 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接