提问人:syaz 提问时间:4/10/2009 最后编辑:cigiensyaz 更新时间:2/6/2023 访问量:64030
允许运行时没有动态分配的数组大小?[复制]
Array size at run time without dynamic allocation is allowed? [duplicate]
问:
我已经使用 C++ 几年了,今天我看到了一些代码,但这怎么可能是完全合法的呢?
int main(int argc, char **argv)
{
size_t size;
cin >> size;
int array[size];
for(size_t i = 0; i < size; i++)
{
array[i] = i;
cout << i << endl;
}
return 0;
}
根据 GCC 编译。
如何在运行时没有 or 的情况下确定大小?new
malloc
只是为了仔细检查,我已经用谷歌搜索了一些,所有与我的代码相似的代码都声称会给出存储大小错误。
甚至Deitel的C++如何编程第261页也指出了常见编程错误4.5:
只能使用常量来声明自动数组和静态数组的大小。
照亮我。
答:
这在 C99 中有效。
C99 标准支持堆栈上可变大小的阵列。可能您的编译器也选择支持此构造。
请注意,这与 和 不同。 在堆栈上分配数组,就像它通过调整堆栈指针一样。不进行堆分配。这很像_alloca
。malloc
new
gcc
int array[100]
评论
它仅在 C99 中有效。下次您可以尝试在可靠的编译器中检查您的代码。
它是有效的 C99,它不是有效的 C++。这是两种语言之间的不少差异之一。
评论
typedef
dynarray
这称为 VLA(可变长度阵列)。它在 c99 中是标准的,但 gcc 允许它在 c++ 代码中作为扩展。如果希望它拒绝代码,请尝试使用 和 选项。-std=standard
-ansi
-pedantic
评论
-std
-ansi
如果您使用的是 Dev-Cpp 编译器,您可以动态地为数组指定大小,我已经尝试过了 并且没有错误,但在 Visual C++ 和 Visual Studio 编译器上这是不可能的。 我认为原因是 dev-c++ 为未初始化的 int 分配了一个正数 当我们给它一个数字时,它就会被给定的数字所取代。 但也许其他编译器为未初始化的变量提供 null。
评论
C++14 标准支持可变长度阵列 (VLA),该标准最近已被接受,正在等待发布。
评论
此代码在 GNU GCC 编译器中运行。
#include<bits/stdc++.h>
int main(int argc, char **argv)
{
size_t size;
std:: cin >> size;
int array[size];
for(size_t i = 0; i < size; i++)
{
array[i] = i;
std:: cout << i;
}
return 0;
}
我最近遇到了一个需要堆栈分配阵列的场景。(它是 v8 的包装器,每个方法调用都需要一个参数数组)。
std::vector 将执行堆内存分配,其性能是不可接受的。
这是我的解决方案,使用模板来分配案例数组:
template<size_t Argc>
static void call(...) {
v8::Local<v8::Value> v8Args[Argc];
// use v8Args
...
}
template<typename It>
static void callV8Function(size_t argc, It argvBegin, It argvEnd,) {
// C++ don't have dynamic stack allocation (like C99 does)
// try to avoid heap-allocation...
if (argc <= 4) {
return callV8FunctionOnStack<4>(...);
} else if (argc <= 8) {
return callV8FunctionOnStack<8>(...);
} else if (argc <= 16) {
return callV8FunctionOnStack<16>(...);
} else if (argc <= 32) {
return callV8FunctionOnStack< 32>(...);
} else {
std::vector<v8::Local<v8::Value>> v8Args(argc);
// fallback to vector
}
}
(当然,我可以只使用一个 32 大小的数组,但它不是那么优雅。
评论