77

我已经使用 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如果没有or ,如何在运行时确定大小malloc

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

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

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

照亮我。

4

8 回答 8

72

这在 C99 中有效。

C99 标准支持堆栈上的可变大小数组。可能您的编译器也选择支持此构造。

请注意,这与malloc和不同newgcc在堆栈上分配数组,int array[100]就像调整堆栈指针一样。没有进行堆分配。这很像_alloca

于 2009-04-10T10:22:48.543 回答
26

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

于 2009-04-10T11:00:25.473 回答
7

它仅在 C99中有效。下次您可以尝试在可靠的编译器中检查您的代码。

于 2009-04-10T10:29:50.850 回答
4

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

于 2009-04-10T10:33:33.197 回答
1

此代码在 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;
}
于 2015-09-03T19:37:14.347 回答
0

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

于 2013-03-05T07:05:07.170 回答
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 大小的数组,但这并不那么优雅。)

于 2019-10-21T08:27:26.850 回答
-1

C++14 标准支持可变长度数组 (VLA),该标准最近已被接受,正在等待发布。

于 2014-10-13T14:38:02.990 回答