【问题标题】:Is it possible to create an array on the stack, if its size is unknown at compile time?如果在编译时它的大小未知,是否可以在堆栈上创建一个数组?
【发布时间】:2013-07-07 19:58:14
【问题描述】:
int main(){
    int size;
    cin >> size;
    int myArray[size];
    return 0;
}

myArray 是否分配在堆栈上?如果在编译时它的大小是未知的,那怎么办?

顺便说一句,是否可以在堆栈上分配一个动态大小的数组?

这些可能是不好的做法,但我问的是是否允许,而不是是否是好的做法。

【问题讨论】:

标签: c++ c


【解决方案1】:

是的,在哪里/何时允许这样做(在 C++ 中实际上是不允许的,尽管 gcc 允许它作为扩展)myArray 将在堆栈上分配。实现非常简单:选择大小并从堆栈指针中减去它。

如前所述,C++ 目前不允许这样做,但是关于允许它的 dynarray 类的提议已被 C++ 14 的工作文件接受,因此类似的东西(可能)很快就会被允许(如果你的编译器还没有——有些人可能很容易这样做,尽管我从未测试过)。

【讨论】:

  • 谢谢。是否也可以调整大小?我在想这是不可能的?好吧,也许有可能,但实施起来非常困难,而且不会做对吗?
  • @user2380088:至少据我所知,没有调整数组大小的规定。实现不会特别困难,但语言中没有任何东西可以支持它。
  • 只有当它们当前位于堆栈的顶部时才可以调整它们的大小,这实际上意味着您无法调整它们的大小(提出某种语言会很混乱保证)。
  • 从技术上讲,即使它不在堆栈顶部,也不能调整大小吗?如果它在中间的某个地方,您只需将所有内容向上或向下移动。这会很糟糕,但有可能,对吧?
  • @user2380088:这将使任何指向当前位于 VLA 上方堆栈中的变量的指针无效(除了其他内容)。
【解决方案2】:

是的,这是完全有可能的,尽管刚刚指出这仅在 ISO C99 中可用,并且作为 C++ 中的 GCC 扩展。如果我可以引用GNU website

在 ISO C99 中允许使用可变长度自动数组,并作为 扩展 GCC 在 C90 模式和 C++ 中接受它们。这些数组是 像任何其他自动数组一样声明,但长度为 不是常量表达式。

【讨论】:

    【解决方案3】:

    看起来 (cin) 你想使用 C++。如果是这样,也许你应该使用 std::vector。

    要设置大小,是的,在堆栈上,请参阅 How to set initial size of std::vector?

    【讨论】:

    • 我知道 std::vector 存在。只是在询问这件事的合法性。
    • 向量的内容不会被分配到栈中。
    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2015-05-05
    • 2021-08-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多