如果指针可以在运行时动态地改变数组的大小,为什么有必要用size初始化数组呢?
If pointers can dynamically change the size of arrays at run time, why is it necessary to initialize the array with a size?
例如:
int* pArray;
pArray = new array[];
代替:
int* pArray;
pArray = new array[someNumber];
由于指针能够在运行时动态改变数组的大小,并且指针的名称指向数组的第一个元素,那么默认大小不应该是[1]
吗?有人知道幕后发生了什么吗?
由于指针能够在运行时动态改变数组的大小
这不是真的。它们不能改变数组的大小,除非你用新的数组大小分配一个新的数组。
如果你想有一个类似数组的对象,它可以动态地改变大小,你应该使用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
当您使用new创建数组时,您正在为该数组分配特定数量的内存量。你需要告诉它要存储多少项,这样它才能分配足够的内存。
当你"调整"数组的大小时,你是在创建一个新的数组(一个有更多内存的数组),并在删除旧数组之前复制项目(否则你会有内存泄漏)。
很简单,c++数组没有自动更改其大小的功能。因此,在分配数组时,必须指定它的大小。
指针不能改变数组。但是,它们可以在运行时指向不同的数组。
然而,我建议你远离任何涉及new
的东西,直到你对这门语言有了更多的了解。对于数组动态改变它们的大小,使用std::vector
。
指针指向动态分配的内存。内存位于堆中而不是堆栈中。它是动态的,因为您可以在其上调用new和delete,在运行时向其添加和从中删除(简单地说)。指针与此无关——指针可以指向任何东西,在这种情况下,它恰好指向动态内存的开始。内存的调整和管理完全是你的责任(或者你可能使用的容器的责任,例如std::vector管理动态内存并充当动态数组)。
它们不能动态地改变大小。您可以从堆中获得指向新内存分配的指针。
在后台有内存分配,机器中的一小块硅现在专用于您刚刚new
编辑的数组。
当您想要"调整"数组的大小时,只有当硅块周围有一些空闲空间时,才有可能在处执行操作。大多数情况下,有必要保留另一个更大的块并复制第一个块中的数据。显然要放弃第一个(否则就会出现内存泄漏)。
这是由STL容器自动完成的(如std::vector
或std::deque
),但在您自己调用new
时手动完成。因此,避免泄漏的最佳解决方案是使用标准库而不是尝试自己模拟它。
int *pArray = new int;
可以被认为是一个大小为1的数组,它在默认情况下会做你想要的。
但是如果我需要一个包含10个元素的数组呢?指针没有任何神奇的能力,它们只是指向内存,因此:
pArray[5] = 10;
只会产生一个运行时错误(如果你幸运的话)。
因此有可能通过调用new type[size]
来分配所需大小的数组。
- 数组长度,为什么从命令行获取时不能使用它?
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我不能将 rand() 与数组的大小一起使用?
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- 为什么我的排序算法会更改数组值
- 为什么std::vector比数组慢
- 为什么调用堆栈数组会导致内存泄漏
- 为什么用结构初始化数组需要指定结构名称
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 为什么可以修改数组 b?
- 为什么我们将单个或多维数组的大小声明为常量值?
- 为什么我的数组双精度函数不起作用?
- 为什么 2 个相同数组的元素彼此相等
- 为什么 &a 和 c++ 中的静态数组相同?
- 初始化不可移动对象数组:为什么这样的代码无法在 GCC 上编译?
- C++ 结构数组 - 为什么它必须是指针
- 在C++中添加两个 2D 数组 - 为什么这个程序崩溃
- 动态分配缓冲空间为二维数组 - 为什么失败
- 非恒定大小的数组:为什么这甚至可以工作
- C++字符数组——为什么是垃圾