指向数组的指针会更改数组元素的值
Pointer to array changes value of array elements
我有一个我传递到函数的整数数组。然后,我想在该功能中作为第一个数组的副本进行动态数组,但是每当我更改第二个数组中元素的值(副本)时,第一个数组中的值也会更改。我在做什么错?
示例:
int *array1 = new int[N]
int *array2 = new int[N]
array2 = array1;
array2[1]=2; //element of the first array at index 1 also becomes 2
谢谢。
说明:
由于我们正在处理C ,因此几乎没有理由使用new int[N]
而不是大小N
的std::vecotr<int>
。
解释代码中发生的事情:您创建一个名为array1
的指针,并分配足够的内存以包含N
整数。您使用第二个指针,称为array2
。由于名称 array1
和 array2
只是记忆的指针,因此可以更改它们的指向。在线路array2 = array1
中,您将指向array2
指向内存并通过array1
指针指向内存的内容。
那么现在会发生什么?真的很糟糕。您正在遇到内存泄漏。array2
指向的内存仍然存在,仍分配,但是您无法访问它,因为您唯一访问它(array2
指针)现在指出了完全不同的内存部分。现在,您也有2个指向相同内存的指针(最初是在int *array1 = new int[N]
行中分配的内存)。
如何改进您的代码?
使用std::vector<int>
。矢量类配备了良好且安全的任务操作员,可以在这里为您服务:
std::vector<int> array1(N);
std::vector<int> array2(N);
array2 = array1;
现在您有2个相同的向量,内存很好地管理(array1
和array2
是独立的实体。它们不共享相同的内存,并且可以自由地更改而不会影响另一个,并且您的代码看起来很漂亮。
如果您不能将所有内容更改为std::vector
?
您提到的具有传递到功能的数组。让我们称其为大小N
的original_array
。考虑使用类似签名的该代码,,但通过将数组转换为vector :
void copy_and_do_stuff(int original_array[], int N)
{
std::vector<int> array2;
std::copy(original_array, original_array + N, array2.begin());
// here, the vector "array2" is a copy of your `original_array`. Changes
// to it will not affect your argument.
// ... do whatever you need to do in this function ...
}
记住添加#include <vector>
和#include <algorithm>
使用向量和std::copy
函数。
给出一个完整的答案,尽管这些评论到目前为止都很重要:
行array2 = array1;是否以下内容:取在Array1中存储的地址并将其存储在Array2中。他们俩现在都指向同一位置(并且旧的保留存储仍然保留但不指向,也不是记忆丢失)
无论如何,指针有些危险的事情,很容易导致出乎意料的行为,尤其是如果您是初学者。因此,您要使用std :: vector:
//at the head of the file
#include <vector>
using std::vector;
//in the program
vector<int> array_1(n);
//do something with array_1:
array_1[0] = 1;
array_1[1] = ...
vector<int> array_2 = array_1; //actually copies the content
或:
vector<int> array_2(array_1); //copy constructor
在某个时候,您需要研究向量内部的工作原理(实际上它包含一个数组),但是现在,只需使用向量即可。阅读文档。您可以使用STD库在上面做各种各样的事情,例如,通过std :: sort。
如评论中所述,您可能不应该在C 中这样做;STD ::向量是优化的;安全可靠的处理此类数据的方法。
,但是从您的问题来看,您不太了解指示。
这是您的代码:
int *array1 = new int[N]; //allocate memory for the first array
int *array2 = new int[N]; //allocate memory for the second array
array2 = array1; //OVERWRITE the location of the second array
//with that of the first (thus destroying your
//only pointer to the second array and creating a
//memory leak)
要在Array2 = Array1中实现您想要的东西,您需要编写一个循环,然后将数组的每个整数元素复制到新数组 - 这创建了一个"深"副本。
array1和2是您的情况。当您这样做时:
array2 = array1;
array2指向与array1相同的内存位置,并且旧的array2在内存中丢失(因此,它会产生内存泄漏,如Elemental所述)您需要手动复制数组元素或使用std :: vector
- 从指向结构数组的指针中提取元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 使用指针访问数组元素时出现意外结果
- 指针数组.获取指针元素的值
- 指向数组的指针是否应该等于指向其第一个元素的指针?
- 如何理解取消引用指向数组的指针会获取指向元素的指针
- 如何使用指针更改数组元素
- 通过指针访问数组元素
- C 中的动态数组(用指针表示) - 输入元素
- 字符指针对象和相应的字符数组元素比较
- 无法访问指向数组的指针的元素
- 指向数组的指针会更改数组元素的值
- C++如何使用指针来循环移位数组元素
- 从 C++ 数组元素的指针获取索引的最快方法是什么
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 从C++中的指针访问数组元素
- 数组元素值,元素地址和指针增量
- 返回指向指针数组的指针获取下一个元素失败
- 数组的指针,该数组的每个元素的内存空间信息存储在哪里