【问题标题】:can we give size of static array a variable我们可以给静态数组的大小一个变量吗
【发布时间】:2011-10-08 11:49:09
【问题描述】:

大家好,我想问一下,我已经读到我们只能通过使用指针和使用 malloc 或 newlike 来声明动态数组

int * array = new int[strlen(argv[2])];

但我写过

int array[strlen(argv[2])];

它没有给我任何错误

我已经读到静态数组只能通过给定数组大小来声明,但这里我给静态数组一个可变大小

为什么这么感谢


使用是否安全,或者在任何后期阶段它都会给我使用 gcc linux 带来问题

【问题讨论】:

  • 我有错误。你在用什么编译器?
  • 先生,我正在使用 gcc linux,它的工作原理非常好:/
  • 你只能在创建数组时使用 const。像 const int size = strlen(argv[2]);整数数组[大小];
  • 除了这个问题,有时我想知道,C99 是如何处理 VLA 的?它如何为编译时甚至不知道的长度分配连续内存。
  • @iammilind 与分配任何堆栈变量的方式相同:通过从ESP 中减去。

标签: c++ c


【解决方案1】:

您所拥有的称为可变长度数组 (VLA),它不是C++ 的一部分,尽管它 C99 的一部分。许多编译器将此功能作为扩展提供。

即使是非常新的 C++11 也不包含 VLA,因为整个概念不适合 C++11 的高级类型系统(例如,decltype(array) 是什么?),而 C++ 提供了功能更强大的运行时大小数组的现成库解决方案(如std::vector)。

在 GCC 中,使用 -std=c++98/c++03/c++0x-pedantic 编译会给你一个警告。

【讨论】:

【解决方案2】:

C99 支持 variable length array,它定义在 c99,第 6.7.5.2 节。

【讨论】:

    【解决方案3】:

    您所写的内容适用于 C99。这是一个名为“可变长度数组”的新增功能。通常不鼓励使用这些数组,因为没有接口会导致分配失败(malloc 可以返回 NULL,但如果无法分配 VLA,程序将出现段错误或更糟,行为不稳定)。

    【讨论】:

      【解决方案4】:
      int array[strlen(argv[2])];
      

      这肯定不是有效的 C++ 标准代码,因为它定义了一个可变长度数组 (VLA),这在任何版本的 C++ ISO 标准中都是不允许的。它仅在 C99 中有效。并且在 C 或 C++ 实现的非标准版本中。 GCC 在 C++ 中也提供 VLA 作为扩展。

      所以你只剩下第一个选项了。但别担心,你甚至不需要那个,因为你有更好的选择。使用std::vector<int>

      std::vector<int> array(strlen(argv[2])); 
      

      使用它。

      【讨论】:

      • 先生,它没有给我任何错误,就像我不明白为什么......我所有的概念都被毁了:/
      • @mainajaved:正如我所说,它是作为扩展提供的。如果你使用的是 GCC,那么用-pedantic 选项编译你的程序,你会得到错误。
      • 好的,谢谢先生,先生也请给我一个使用 -pendantic 选项编译的示例,我在任何地方都找不到它
      【解决方案5】:

      一些编译器并不完全符合 C++ 标准。您指出的内容在 MinGW (iirc) 中是可能的,但在大多数其他编译器(如 Visual C++)中是不可能的。

      在幕后实际发生的是,编译器会更改您的代码以使用动态分配的数组。

      我建议不要使用这种非标准的便利。

      【讨论】:

      • 我意识到您可能正在回答问题的C++ 部分并且如果问题被认为是完全正确的,但对于C 问题,您的回答都是错误的。可变长度数组是标准的,通常分配在堆栈上,Visual C 不支持它们只是因为它不符合 C99。
      • @Pascal 你是对的。我编辑了答案以明确我在谈论 C++。
      【解决方案6】:

      不安全。堆栈的大小是有限的,像这样根据用户输入从堆栈中分配可能会溢出堆栈。

      对于 C++,使用 std::vector&lt;&gt;

      其他人已经回答了为什么它“有效”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-13
        • 2022-01-09
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        相关资源
        最近更新 更多