【问题标题】:Dynamic Arrays and Static Arrays Compile Time or Runtime? [duplicate]动态数组和静态数组是编译时还是运行时? [复制]
【发布时间】:2017-11-08 14:37:06
【问题描述】:

我了解静态数组和动态数组的基本概念。这两者之间的主要区别是一个(静态数组)在编译时分配内存,另一个在运行时分配。但是,我们可以创建静态数组,其大小将是用户输入的值。

int value ;
cin >> value  ;

int array [value] ;
int i = 0 ;
while(i < value)
{
    cin >> array[i] ;
    i ++ ; 
}

所以程序直到运行时才知道这个数组的大小。 那么,如果静态数组也可以在运行时分配空间,那么静态数组和动态数组之间的实际根本区别是什么?

另外,谈到数组的可调整大小。要扩展一个动态数组,我们可以在将它的元素复制到一个新的双倍大小的动态数组后删除之前的数组。我们也可以对静态数组做同样的事情,对吧? [但是,在这种情况下无法删除原始数组,并使用冗余堆栈空间。那么这是 S.Array 和 D.Array 之间的唯一区别吗]

【问题讨论】:

  • “原始”数组永远不是动态的(它们不会改变大小),但可以动态分配。 std::vector 是动态的(可以在运行时调整大小),应该在这种情况下使用。
  • VLA 不是标准 C++。这是一个扩展。
  • 在编译时分配内存不,这是不可能的。
  • @manni66 你是对的。我认为它们的意思是一个静态的、固定大小的数组

标签: c++ arrays variable-length-array


【解决方案1】:

作为 C99 标准的一部分,有称为“可变长度数组”的编译器扩展,允许这种声明。

C99 标准并未作为 C++ 语言的一部分得到官方支持。

上面的代码在 MSVS (Microsoft Visual Studio) 中无法运行,因为它不支持 C99,但会被 gccclang 成功编译

【讨论】:

    【解决方案2】:

    静态数组存储在堆栈上,而动态数组存储在堆上。当某些东西存储在堆栈中时,一旦超出范围,它就会被处理掉。例如整数、字符等。但是,如果它是在堆上创建的,则必须确保垃圾收集在超出范围时完成其工作。如果您没有正确清理和取消分配内存,您可能会出现内存泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-24
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2012-12-14
      相关资源
      最近更新 更多