数组大小在运行时没有动态分配是允许的吗?

我已经使用 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;
}

根据海湾合作委员会编制。

在没有 newmalloc的情况下,如何在运行时确定大小?

只是为了再次检查,我已经谷歌了一些和我的所有类似的代码都声称给存储大小错误。

即使是 Deitel 的 C + + 如何编写 p.261代码,也会出现常见编程错误4.5:

只有常量可用于声明自动和静态数组的大小。

说来听听。

60037 次浏览

这在 C99中是有效的。

C99标准支持堆栈上可变大小的数组。可能你的编译器也选择了支持这种结构。

请注意,这与 mallocnew不同。gcc在堆栈上分配数组,就像它在 int array[100]中通过调整堆栈指针分配数组一样。没有完成堆分配。很像 _alloca

它是 有效只在 C99。下次你可以尝试检查你的代码在一个 可靠的编译器

它是有效的 C99,它不是有效的 C + + 。这是这两种语言之间不少差异之一。

这就是所谓的 VLA (可变长度数组)。它在 c99中是标准的,但是 gcc 在 c + + 代码中允许它作为扩展。如果您希望它拒绝代码,请尝试使用 -std=standard-ansi-pedantic选项。

如果你正在使用 Dev-Cpp 编译器,你可以动态地给一个数组赋予大小,我已经试过了 没有错误,但是在 Visual c + + 和 Visual Studio 编译器上是不可能的。 我认为原因是 dev-c + + 为未初始化的 int 赋了一个正数 当我们给它一个数字时,它就被给定的数字所代替。 但也许其他编译器会给未初始化的变量赋空值。

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的一个包装器,每次方法调用都需要一个 args 数组)。

向量将执行堆内存分配,其性能是不可接受的。

下面是我的解决方案,使用模板来分配案例数组:

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大小的数组,但这并不那么优雅。)