如果我可以创建数组,为什么还需要动态内存分配?

6
我正在阅读有关动态内存分配和静态内存分配的内容,并发现以下关于动态内存分配的内容:
在先前章节中看到的程序中,所有的内存需求都是通过定义所需变量来确定的。但是,在运行时可能会出现仅能在运行时确定程序内存需求的情况。例如,当所需内存取决于用户输入时。
因此,我用C++编写了以下程序:
#include <iostream>

int main()
{
  int n = 0;
  int i = 0;

  std::cout << "Enter size: ";
  std::cin >> n;
  int vector[n];

  for (i=0; i<n; i++)
  {
    vector[i] = i;
  }

  return 0;
}

这个程序可以正常运行。 我不理解它是如何工作的。 在这里,什么时候确定大小? 在这种情况下,向量是如何分配的?


1
以上代码不符合C++标准。编译器有时会接受不合法的代码。 - john
我必须说,你在标题中提出的问题与你在帖子正文中提出的问题非常不同。 - StoryTeller - Unslander Monica
2个回答

8
根据此文档(强调是我的):
可变长度自动数组在ISO C99中被允许,并且作为GCC在C90模式和C++中接受它们的扩展。这些数组像其他自动数组一样声明,但长度不是常量表达式。存储器在声明时分配,在包含声明的块作用域退出时释放
请注意,这只是一个扩展,不能在每个编译器上使用,例如在MSVC中无法工作(我得到错误“表达式必须具有常量值”)。

4
禁止使用可变边界并不是动态分配一个东西的唯一原因。生命周期和所有权也是决策的重要部分。 - Lightness Races in Orbit

-2

以上代码在最新版编译器中会产生错误。该代码适用于旧版本的DOSBOX。

数组的大小必须是常量整数。

你可以用两种方式定义它

1.#define Macron

#include<iostream>
#define n 5

main() {
   ...
      ...
      int array[n];
}

2. const 关键字

#include<iostream>
....
main() {
   int x;
   cout << "Enter Size Of Array";
   cin >> x;

   const int n = x;

   int array[n];
   ...
      ...
}

这并不是有效的:const int n = x;该值仍然取决于运行时的值,因此不是编译时常量,也不是有效的数组边界。将大小定义为“Macron”也无济于事,该值需要从用户读取。 - Jonathan Wakely
它不起作用,我得到了“表达式必须具有常量值”的错误。 - Dmytro Dadyka
它对我有效。我使用g++命令编译了程序。 - core

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接