Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果指针可以在运行时动态更改数组的大小,那么为什么需要用一个大小来初始化数组?_C++_Arrays_Pointers_Dynamic - Fatal编程技术网

C++ 如果指针可以在运行时动态更改数组的大小,那么为什么需要用一个大小来初始化数组?

C++ 如果指针可以在运行时动态更改数组的大小,那么为什么需要用一个大小来初始化数组?,c++,arrays,pointers,dynamic,C++,Arrays,Pointers,Dynamic,例如: int* pArray; pArray = new array[]; 而不是: int* pArray; pArray = new array[someNumber]; 既然指针能够在运行时动态更改数组的大小,并且指针的名称指向数组的第一个元素,那么默认大小不应该是[1]?有人知道幕后发生了什么吗?因为指针能够在运行时动态更改数组的大小 事实并非如此。除非使用新大小分配新数组,否则它们无法更改大小 如果希望有一个类似数组的对象动态更改大小,则应使用std::vector #inclu

例如:

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
#包括
#包括
...
std::矢量阵列;
数组。推回(1);
阵列。推回(2);
阵列。推回(3);
阵列。推回(4);

STD::CUT

很简单,C++数组没有自动改变大小的工具。因此,在分配数组时,必须指定其大小。

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


但是,我建议您在进一步了解该语言之前,不要接触任何涉及
新内容的内容。对于动态更改大小的数组,请使用
std::vector

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


当您“调整”数组大小时,您正在创建一个新的数组(一个内存更多的数组),并在删除旧数组之前复制这些项(否则会出现内存泄漏)。

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

int*pArray=new int
可以被认为是一个大小为1的数组,它“默认”可以满足您的需要

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

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


因此,可以通过调用
新类型[size]
来分配所需大小的数组。它们无法动态更改大小。您可以从堆中获取指向新内存分配的指针

在幕后有内存分配,您机器中的某个地方有一小块硅片现在专用于您刚刚
new
ed的阵列

当您想要“调整”阵列大小时,只有在硅片周围有一些可用空间的情况下才能在适当的位置进行调整。大多数情况下,需要保留另一个更大的数据块并复制第一个数据块中的数据。。。并且显然要放弃第一个(否则就会出现内存泄漏)


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

-1“
int*pArray=new int;
可以被视为大小为1的数组,它“默认”会做你想要的事情。-这是胡说八道。也许这是我的蹩脚英语,我的意思是他最初写的他想要
pArray=newarray[]创建1个元素的数组作为默认行为,这就是
newint可以。它几乎是一个大小为1的数组。询问者似乎很困惑。现在你邀请他混合使用
new
/
new[]
delete
/
delete[]
?如果你要在第一时间动态分配数组,你必须非常小心,并且知道你在做什么。如果我远离new,我该如何学习该语言?我知道对象和实例是什么(因此,我理解new的目的),那么您建议我什么时候开始使用new?另外,我建议你不要在stack上发表评论,直到你能提出建设性的评论,而不是重复前两篇帖子。@Hollis我可以建议你对那些试图帮助你的人表示更多的尊重,花时间回答你的问题吗?尤其是当这些人是社区中有价值的成员,他们在这个网站上的技能已经得到了充分的证明。@Hollis:你使用自动(基于堆栈的)对象。您还可以使用那些包装动态(基于堆)对象的对象,就像
std::vector
std::string
一样。对于初学者来说,不弄乱std::vector及其迭代器已经足够复杂了。当我教C++时,代码> STD::向量< /代码>在第三课中被介绍,<代码>新< /代码>也许在第十。霍利斯:关于你的建议:请不要粗鲁。当我写我的答案时,还没有人提出我的观点。一个早期的答案后来被修改为包含它(我对此投了更高的票),但那时候没有。@sbi我们甚至没有在我的课上讨论向量。到目前为止,我们已经从指针到链表,而他从未提到向量。我误解了教授关于在运行时调整数组大小的说法。我回顾了我的笔记,本质上,他说用户可以在运行时指定数组的大小并创建一个新数组,而不是在运行时更改给定数组的大小。答案很好!我知道