为什么我们不声明可变大小的数组?

Why do we not declare arrays with variable size?

我的主管在我的 C 代码中看到了类似于以下内容的内容:

size = f(some parameters);
int array[size];

他说最好用malloc分配这样的数组。他的描述是这样的:

像这样在堆栈上分配它要求您的堆栈在整个 run-time 程序中保持有效。

我不知道他的意思,所以这和我记得他在会议结束时的措辞很接近,但不知道真正的意思。他是什么意思? (或者,也许有人可以解释不以这种方式声明数组的另一个原因)。

任何声明为本地的变量将仅在函数执行期间有效,因为它将在堆栈中分配

如果你在声明它的函数之外需要这个数组,你需要用 malloc 分配它,但如果你只在这个函数内部使用它并且在这个执行过程中是可以的

请注意,任何局部变量都会使用堆栈内存,因此请确保您的数组永远不会大到足以导致程序中的堆栈溢出!

一般来说,在中使用可变长度数组并没有错。数组将存在于它声明的范围内,就像任何其他变量一样。这是你应该始终牢记的事情,所以当然,如果你在函数中声明 VLA 并尝试 return 指向它的指针,这是一个错误(它不存在任何离开该功能后会更多)。

不使用 VLA 的原因:

  • 如果您甚至在从创建它的函数 returning 之后还需要数组,当然您不能使用它,如上所述,但是对于具有 [=18= 的任何对象都是如此]自动存储
  • 堆栈space有点受限,所以如果你的数组真的很大,最好动态分配它。
  • 使 VLA 可选。因此,您使用 VLA 的代码可能不再适用于符合标准的 C11 编译器。