我对可变长度数组有些担忧。当我想要动态分配一个数组时,如果无法分配足够的内存,我会得到空值,并且可以在程序中正确地响应此问题。但是对于可变长度数组,我无法获得这些信息。我该怎么处理?
我对可变长度数组有些担忧。当我想要动态分配一个数组时,如果无法分配足够的内存,我会得到空值,并且可以在程序中正确地响应此问题。但是对于可变长度数组,我无法获得这些信息。我该怎么处理?
您是正确的,VLA基本上总是不安全的。唯一的例外是如果您确保它们永远不会比您认为安全的固定大小数组更大,那么在这种情况下,您可能会想直接使用固定大小数组。有一类晦涩难懂的递归算法,其中VLA可能成为无法解决问题(堆栈溢出)和能够解决问题的区别所在,但在大多数情况下,我建议永远不要使用VLA。
但这并不意味着VLA类型是无用的。虽然VLA不好/危险,但指向VLA的指针类型非常有用。它们使得可以拥有动态分配(通过 malloc
)的多维数组,而不需要手动进行维度计算,例如:
size_t n;
double (*matrix)[n] = malloc(n * sizeof *matrix);
想要获取一个可以通过matrix[i][j]
方式访问的 n × n 矩阵。
n
个双精度数组的指针分配n*n
矩阵的内存的? - haccksn
)的一维数组,因此需要一个指向 double[n]
的指针。调用 malloc
分配了空间来存储 n
个这样的数组(sizeof *matrix
给出了一个这样的数组的大小),因此你最终得到了一个指向 n
个 double[n]
对象的数组的第一个元素的指针——即一个二维数组。 - R.. GitHub STOP HELPING ICE
alloca
一样安全。 - phuclv