我已经使用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下编译。
如何在没有new
或malloc
的情况下在运行时确定尺寸?
只是为了仔细检查,我用谷歌搜索了一些和我的所有类似代码声称存储大小错误。
甚至Deitel的C ++如何编程p。共同编程错误4.5下的261个状态:
只能使用常量来声明自动和静态数组的大小。
启发我。
答案 0 :(得分:53)
这在C99中有效。
C99标准支持堆栈上的可变大小的数组。可能你的编译器也选择支持这个结构。
请注意,这与malloc
和new
不同。 gcc
通过调整堆栈指针,就像在int array[100]
上一样,在堆栈上分配数组。没有完成堆分配。它非常像_alloca
。
答案 1 :(得分:19)
这称为VLA(可变长度数组)。它在c99中是标准的,但是gcc允许它在c ++代码中作为扩展。如果您希望拒绝代码,请尝试使用-std=standard
,-ansi
和-pedantic
选项进行试验。
答案 2 :(得分:7)
仅在C99中为valid。下次您可以尝试在reliable compiler中查看代码。
答案 3 :(得分:4)
它是有效的C99,它是无效的C ++。这是两种语言之间的差异之一。
答案 4 :(得分:0)
如果您使用的是Dev-Cpp编译器,您可以动态地为数组赋予大小 并没有错误,但在visual c ++和visual studio编译器上它是不可能的。 我认为原因是dev-c ++为未初始化的int分配了一个正数 当我们给它一个数字时,它被给定的一个替换。 但也许其他编译器会对未初始化的变量赋予null。
答案 5 :(得分:0)
此代码在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;
}
答案 6 :(得分:0)
我最近遇到了需要堆栈分配数组的情况。 (这是围绕v8的包装,每个方法调用都需要一个args数组)。
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大小的数组,但这并不好用。)
答案 7 :(得分:-2)
C ++ 14标准支持可变长度数组(VLA),该标准最近已被接受,正在等待发布。