如果指针可以在运行时动态地改变数组的大小,为什么有必要用大小初始化数组?

时间:2011-10-06 14:37:03

标签: c++ arrays pointers dynamic

例如:

int* pArray;
pArray = new array[];

而不是:

int* pArray;
pArray = new array[someNumber];

由于指针能够在运行时动态更改数组的大小,并且指针的名称指向数组的第一个元素,因此默认大小不应为[1]吗?有谁知道现场背后发生了什么?

8 个答案:

答案 0 :(得分:10)

由于指针能够在运行时动态更改数组的大小

事实并非如此。除非您使用新大小分配新数组,否则它们无法更改大小。

如果你想拥有一个动态改变大小的类似数组的对象,你应该使用std::vector

#include<vector>
#include<iostream>

...
std::vector<int> array;

array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);

std::cout << array.size() << std::endl; // should be 4

答案 1 :(得分:1)

使用new创建数组时,您将为该数组分配特定数量的内存。您需要告诉它要存储多少项,以便它可以分配足够的内存。

当您“调整”数组时,您正在创建一个新数组(一个内存更多的数组)并在删除旧数组之前复制项目(或者您有内存泄漏)。

答案 2 :(得分:0)

很简单,C ++数组无法自动更改其大小。因此,在分配数组时,必须指定它的大小。

答案 3 :(得分:0)

指针无法更改数组。但是,可以使它们在运行时指向不同的数组。

但是,我建议您远离涉及new的任何事情,直到您更多地了解该语言为止。对于使用std::vector动态更改其大小的数组。

答案 4 :(得分:0)

指针指向动态分配的内存。内存位于堆而不是堆栈上。它是动态的,因为你可以在其上调用new和delete,添加它并在运行时从中删除(简单来说)。指针与此无关 - 指针可以指向任何东西,在这种情况下,它恰好指向动态内存的开头。调整大小和管理内存完全是您的责任(或者您可以使用的容器的责任,例如std :: vector管理动态内存并充当动态数组)。

答案 5 :(得分:0)

他们无法动态更改大小。您可以获取指向堆中的新内存分配的指针。

答案 6 :(得分:0)

在幕后分配了内存,机器中某处的一小块硅片现在专用到你刚刚new编辑的阵列。

当您想要“调整”数组时,如果硅块周围有一些自由空间,则只能到位。大多数情况下,有必要保留另一个更大的块,并复制第一个中的数据......显然放弃第一个(否则你有内存泄漏)。

这是由STL容器自动完成的(例如std::vectorstd::deque),但是当您自己调用new时会手动完成。因此,避免泄漏的最佳解决方案是使用标准库而不是尝试自己模拟它。

答案 7 :(得分:-1)

int *pArray = new int;可以被认为是一个大小为1的数组,它有点像你想要的那样“默认”。

但是,如果我需要一个包含10个元素的数组呢? 指针没有任何神奇的能力,因此它们只是指向记忆:

pArray[5] = 10;只会产生运行时错误(如果运气好的话)。

因此,可以通过调用new type[size]来分配所需大小的数组。