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

If pointers can dynamically change the size of arrays at run time, why is it necessary to initialize the array with a size?

本文关键字:数组 为什么 初始化 size 指针 运行时 动态 改变 如果      更新时间:2023-10-16

例如:

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::vectorstd::deque),但在您自己调用new时手动完成。因此,避免泄漏的最佳解决方案是使用标准库而不是尝试自己模拟它。

int *pArray = new int;可以被认为是一个大小为1的数组,它在默认情况下会做你想要的。

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

pArray[5] = 10;只会产生一个运行时错误(如果你幸运的话)。

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