我不明白是否需要动态数组。据我所知,到目前为止,还需要动态数组,因为在运行时不能总是知道数组的大小。
但当然可以做到这一点?:
cin >> SIZE;
int a[SIZE];
那么动态数组和new
运算符的重要性是什么?
答案 0 :(得分:7)
首先,这是编译器扩展而不是标准C ++。其次,该数组在堆栈上分配,而operator new从堆中分配,这是两个非常不同的地方,它们极大地影响了数组的生命周期。如果我想返回该数组,该代码有什么用?第三,如果你想调整它,你会怎么做?
答案 1 :(得分:1)
SIZE
是一个变量,意味着它的值可以被修改。根据定义,数组既不会增长也不会缩小其大小。因此,它的大小需要是编译时常量。
答案 2 :(得分:1)
cin >> SIZE; int a[SIZE];
我的一些用户有足够的时间使用鼠标,您希望他们告诉我的应用程序要分配多少内存?
答案 3 :(得分:0)
动态数组非常方便...假设您继续生成对象,并且您不知道可能生成了多少对象(即,您可以从某人在提示符下输入答案或从网络中获得多少输入插座等)?您要么必须预测需要适当的大小,要么必须编写硬限制。两者都是痛苦的,并且在阵列硬限制的情况下,可能导致为手头的工作分配太多的内存,以试图覆盖可能遇到的每种可能的情况。即使这样,您也可能会产生缓冲区溢出,从而产生安全漏洞和/或崩溃。具有对象动态分配新内存的能力,但保持对象之间的关联,以便您具有恒定时间访问(而不是像链接列表那样获得线性时间访问),这是非常非常的方便的工具。
答案 4 :(得分:0)
在C的早期,当你第一次进入一个函数时,堆栈上的空间是不变的,直到你调用另一个函数或返回它为止。这就是为什么所有变量都需要在函数顶部声明,以及为什么需要在编译时知道数组大小,因此编译器可以保留已知量的堆栈。
虽然C ++放宽了变量声明的限制,但它仍然保留了在编译时了解堆栈需求的限制。我不知道为什么。
如评论中的链接所示,C最终允许使用动态大小的数组。这是在C和C ++被拆分之后出现的,所以C ++并没有自动获得这种能力。在C ++中发现支持它作为扩展并不罕见。
答案 5 :(得分:0)
我个人更喜欢:
std::cin >> size;
std::vector a(size);
后来,正如其他人所提到的,你可以做点像......
std::cin >> size;
a.resize(size);
...但是,这可能是关键点,如果你不想,你不必这样做。如果您的要求和约束使得它们可以满足静态大小数组/向量/其他数据结构那么好。请不要认为你对其他人的要求和限制有足够的了解,从中删除一个非常有用的工具。