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

gru*_*czy 13 c variable-length-array

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

R..*_*R.. 27

你是对的,VLA基本上总是不安全的.唯一的例外是如果你确保你永远不会让它们大于你想要安全制作固定大小数组的大小,那么你也可以使用固定大小的数组.有一种不起眼的递归算法,其中VLA可以区分无法解决问题(堆栈溢出)和能够,但在大多数情况下,我建议永远不要使用VLA.

但这并不意味着VLA类型毫无用处.虽然VLA很糟糕/危险,但指向VLA类型的指针非常有用.它们可以动态分配(通过malloc)多维数组而无需手动执行维度算法,如下所示:

size_t n;
double (*matrix)[n] = malloc(n * sizeof *matrix);
Run Code Online (Sandbox Code Playgroud)

得到一个n-by-n矩阵可寻址为matrix[i][j].

  • 我从未真正考虑过使用VLA演员.我一直以为它会被置于石头之中. (5认同)
  • @haccks:在动态分配数组时,您希望指针类型与数组元素的类型匹配,因为它将指向第一个元素.(注意,这与数组衰减的类型相同.)在二维数组的情况下,它的元素是特定长度的一维数组(这里是`n`),所以你想要一个指向`double的指针[N]`.对`malloc`的调用为`n`这样的数组分配空间(`sizeof*matrix`给出了一个这样的数组的大小),所以最终得到一个指向`n``double的数组的第一个元素的指针[ n]`对象 - 一个二维数组. (3认同)