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