使用可变长度数组是不是安全?
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
double
s 数组的指针?
@hacks:动态分配数组时,您希望指针类型与数组元素的类型相匹配,因为它将指向第一个元素。 (请注意,这与数组衰减到的类型相同。)在二维数组的情况下,其元素是特定长度的一维数组(此处为 n
),因此您需要指向 @987654328 的指针@。对malloc
的调用为n
这样的数组分配空间(sizeof *matrix
给出了一个这样的数组的大小),所以你最终得到一个指向n
double[n]
对象数组的第一个元素的指针 - - 一个二维数组。
@R..;感谢您的澄清。阅读您的答案后,我考虑了一下,终于明白了,但忘了删除评论:P
注意:“VLA 类型”的正确术语是可变修改类型以上是关于使用可变长度数组是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章
将 alloca() 用于可变长度数组是不是比在堆上使用向量更好?