允许在运行时不动态分配数组大小吗?

发布于 2024-07-16 11:45:19 字数 581 浏览 6 评论 0原文

我已经使用 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++ 如何编程》第 11 页。 常见编程错误 4.5 下的 261 个状态:

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

启发我。

I've been using C++ for a few years, and today I saw some code, but how can this be perfectly legal?

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;
}

Compiled under GCC.

How can the size be determined at run-time without new or malloc?

Just to double check, I've googled some and all similar codes to mine are claimed to give storage size error.

Even Deitel's C++ How To Program p. 261 states under Common Programming Error 4.5:

Only constants can be used to declare the size of automatic and static arrays.

Enlight me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

刘备忘录 2024-07-23 11:45:19

这在 C99 中有效。

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

请注意,这与 mallocnew 不同。 gcc 在堆栈上分配数组,就像使用 int array[100] 一样,只需调整堆栈指针即可。 没有进行堆分配。 它非常像 _alloca

This is valid in C99.

C99 standard supports variable sized arrays on the stack. Probably your compiler has chosen to support this construct too.

Note that this is different from malloc and new. gcc allocates the array on the stack, just like it does with int array[100] by just adjusting the stack pointer. No heap allocation is done. It's pretty much like _alloca.

方觉久 2024-07-23 11:45:19

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

This is known as VLAs (variable length arrays). It is standard in c99, but gcc allows it in c++ code as an extension. If you want it to reject the code, try experimenting with -std=standard, -ansi and -pedantic options.

独自唱情﹋歌 2024-07-23 11:45:19

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

It is valid only in C99. Next time you may try checking your code in a reliable compiler.

爱殇璃 2024-07-23 11:45:19

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

It is valid C99, it is not valid C++. This is one of not a few differences between the two languages.

伤痕我心 2024-07-23 11:45:19

该代码在 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;
}

This Code runs in GNU GCC Compiler.

#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;
}
北恋 2024-07-23 11:45:19

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

You can give size to an array dynamically in if you are using Dev-Cpp compiler I have tried it
and got no error but on visual c++ and visual studio compilers it is not possible.
I think the reason is that dev-c++ assigns a positive number to the uninitialized int
and when we give it a number it is replaced by the given one.
but perhaps other compilers give null to uninitialized variables.

寂寞陪衬 2024-07-23 11:45:19

我最近遇到了一个需要堆栈分配数组的场景。 (它是 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 大小的数组,但这不是那么优雅。)

I recently came across a scenario where a stack-allocated array is desired. (It's a wrapper around v8, needed an array of args on every method call).

An std::vector would do heap memory allocation, whose performance is not acceptable.

Here is my solution, use template to allocation array of cases:

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
   }
}

(And of course, I can just do with a 32-sized array, but which is not so elegant.)

海未深 2024-07-23 11:45:19

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

Variable Length Arrays (VLAs) are supported in the C++14 standard, which has recently been accepted, and is awaiting publication.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文