运行时长度的C风格数组是否在堆上分配?[C++] [复制]

qnzebej0  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(82)

此问题已在此处有答案

How does GCC create an array on the stack without its size being given by a constant variable? [duplicate](2个答案)
How does GCC implement variable-length arrays?(2个答案)
Dynamic Arrays and Static Arrays Compile Time or Runtime? [duplicate](2个答案)
昨天关门了。
我知道C++中固定大小的数组在堆栈上分配,我知道使用new[]关键字创建的动态大小的数组将在堆上分配。
但是考虑一下这段代码:

std::cout << "Enter a length of the array: "
int length{};
std::cin >> length;

int arr[length]{};

for (int i{ 0 }; i < length; ++i)
{
    arr[i] = i;
    std::cout << arr[i] << ' ';
}
std::cout << '\n'

它编译起来没有问题。那么,我假设这样的数组被隐式地放在堆上是否正确呢?如果是,它是如何工作的,这个数组使用的内存也是隐式释放的吗?

ars1skjm

ars1skjm1#

这不是标准的C++。
您正在使用的编译器支持在同一文件中混合使用C和C功能。对可变长度数组的支持是C的一个特性。
可变长度数组通常存储在堆栈中。这或多或少相当于用alloca()分配数组。
(我建议避免使用可变长度数组。由于它们不是C
的一部分,因此它们可能与某些C功能的交互很差,大多数C编译器根本不支持它们。您可能希望使用std::vector代替。

相关问题