2

我不明白对动态数组的需求。据我目前了解,动态数组是必需的,因为不能总是知道在运行时需要什么大小的数组。

但肯定有人可以做到这一点吗?:

cin >> SIZE;
int a[SIZE];

那么动态数组和操作符有什么大不了的new呢?

4

6 回答 6

7

首先,这是一个编译器扩展,而不是标准 C++。其次,该数组是在堆栈上分配的,而 operator new 从堆中分配,这是两个非常不同的地方,会极大地影响数组的生命周期。如果我想返回该数组,该代码有什么用?第三,如果你想调整它的大小,你会怎么做?

于 2011-05-19T20:42:02.533 回答
1

SIZE是一个变量,这意味着它的值可以被修改。根据定义,数组的大小既不能增长也不能缩小。所以,它的大小需要是一个编译时间常数。

于 2011-05-19T20:39:49.823 回答
1
cin >> SIZE; int a[SIZE];

我的一些用户很难使用鼠标,您希望他们告诉我的应用程序要分配多少内存?

于 2011-05-19T20:44:56.917 回答
0

个人比较喜欢:

std::cin >> size;
std::vector a(size);

后来,正如其他人所提到的,你可以做类似的事情......

std::cin >> size;
a.resize(size);

...但是,这可能是关键点,如果您不想这样做,则不必这样做。如果您的要求和约束能够满足静态大小的数组/向量/其他数据结构,那就太好了。请不要认为您对其他人的要求和限制了解得不够多,无法从他们那里删除一个非常有用的工具。

于 2011-05-19T21:12:04.470 回答
0

动态数组非常方便......假设您不断生成对象,并且您不知道可能会生成多少对象(即,您可以从有人在提示时输入答案或从网络套接字等获得多少输入.)?您要么必须预测需要什么合适的尺寸,要么必须编写硬限制代码。两者都很痛苦,并且在对数组进行硬限制的情况下,可能会导致为手头的工作分配过多的内存,以便尝试覆盖可能遇到的所有可能情况。即使这样,您也可能会导致缓冲区溢出,从而产生安全漏洞和/或崩溃。具有对象动态分配新内存的能力,同时保持对象之间的关联,以便您具有恒定时间访问(而不是像您这样的线性时间访问)

于 2011-05-19T20:42:45.387 回答
0

在早期的 C 语言中,当你第一次进入一个函数时,堆栈上会留出空间,而堆栈的大小在你调用另一个函数或返回之前是不变的。这就是为什么所有变量都需要在函数顶部声明的原因,以及为什么需要在编译时知道数组大小,以便编译器可以保留已知数量的堆栈。

虽然 C++ 放宽了变量声明的限制,但它仍然保留了在编译时知道堆栈要求的限制。我不知道为什么。

正如评论中的链接所述,C 最终允许动态大小的数组。这是在 C 和 C++ 分离之后出现的,因此 C++ 并没有自动获得这种能力。在 C++ 中发现它被支持作为扩展的情况并不少见。

于 2011-05-19T20:48:08.193 回答