指向数组的指针更改数组元素的值

时间:2017-02-23 12:58:14

标签: c++ arrays pointers

我有一个整数数组,我传入函数。然后我想在该函数中创建一个动态数组作为第一个数组的副本,但每当我更改第二个数组(副本)中元素的值时,第一个数组中的值也会发生变化。我做错了什么?

示例:

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

谢谢。

3 个答案:

答案 0 :(得分:4)

说明:

由于我们正在处理C ++,因此几乎没有理由使用new int[N]而不是大小为std::vecotr<int>的{​​{1}}。

解释代码中发生的事情:创建一个名为N的指针,并分配足够的内存以包含array1个整数。您使用名为N的第二个指针执行相同的操作。由于名称array2array1只是指向内存的指针,因此可以更改它们指向的内容。在行array2中,您将更改为将array2 = array1指向由array2指针分配和指向的内存的内容。

那么现在发生了什么?真的很糟糕的东西。您遇到内存泄漏array1指向的内存仍然存在,仍然已分配,但您无法访问它,因为您对它的唯一访问权限(array2指针)现在指向到完全不同的记忆部分。您现在还有2个指向同一内存的指针(最初是在行array2中分配的内存)。

如何改进代码?

使用int *array1 = new int[N]。 Vector类带有编写良好且安全的赋值运算符,可在此处运行:

std::vector<int>

现在你有2个相同的向量,内存管理得很好(std::vector<int> array1(N); std::vector<int> array2(N); array2 = array1; array1是独立的实体。它们不共享相同的内存,可以自由更改而不会影响另一个)和你的代码看起来很漂亮。

如果您无法将所有内容更改为array2

,该怎么办?

您提到了一个传递给函数的数组。我们称之为std::vector,其大小为original_array。请考虑使用类似签名的代码,但通过将数组转换为向量来使用安全的内存管理

N

请记住添加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>函数。

答案 1 :(得分:-1)

正如评论中所提到的,你可能不应该在c ++中这样做; std :: vector是优化的;处理此类数据的安全可靠的方法。

但是从你的问题中可以清楚地看出,你并没有真正理解指针。

这就是你的代码所做的:

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中实现您想要的效果,您需要编写一个循环并将数组的每个整数元素复制到新数组中 - 这会创建一个深层次的&#39;副本。

答案 2 :(得分:-2)

array1和2是你的情况下的指针。 当你这样做时:

array2 = array1;

array2指向与array1相同的内存位置,旧的array2在内存中丢失(因此它会产生内存泄漏,正如Elemental所说) 您需要手动复制数组元素或使用std :: vector