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

Pointer to array changes value of array elements

本文关键字:数组元素 指针 数组      更新时间:2023-10-16

我有一个我传递到函数的整数数组。然后,我想在该功能中作为第一个数组的副本进行动态数组,但是每当我更改第二个数组中元素的值(副本)时,第一个数组中的值也会更改。我在做什么错?

示例:

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]而不是大小Nstd::vecotr<int>

解释代码中发生的事情:您创建一个名为array1的指针,并分配足够的内存以包含N整数。您使用第二个指针,称为array2。由于名称 array1array2只是记忆的指针,因此可以更改它们的指向。在线路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个相同的向量,内存很好地管理(array1array2是独立的实体。它们不共享相同的内存,并且可以自由地更改而不会影响另一个,并且您的代码看起来很漂亮。

>

如果您不能将所有内容更改为std::vector

您提到的具有传递到功能的数组。让我们称其为大小Noriginal_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