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

时间:2009-04-10 10:21:06

标签: c++ c array-initialization

我已经使用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下编译。

如何在没有newmalloc的情况下在运行时确定尺寸?

只是为了仔细检查,我用谷歌搜索了一些和我的所有类似代码声称存储大小错误。

甚至Deitel的C ++如何编程p。共同编程错误4.5下的261个状态:

  

只能使用常量来声明自动和静态数组的大小。

启发我。

8 个答案:

答案 0 :(得分:53)

这在C99中有效。

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

请注意,这与mallocnew不同。 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),该标准最近已被接受,正在等待发布。