是否可以在内存分配之前复制动态分配的数组指针?

时间:2012-04-02 05:03:04

标签: c++ arrays

首先,如果之前有人问过,我道歉。我似乎无法找到正确的信息。

以下代码不打印“300”,因为我认为:

#include <iostream>

int main()
{
  int *array;
  int *arrayCopy = array;

  array = new int[4];

  array[0] = 100;
  array[1] = 200;
  array[2] = 300;
  array[3] = 400;

  std::cout << arrayCopy[2];

  return 0;
}

然而,如果我移动线

,它确实如此
int *arrayCopy = array;

在上面代码中它后面的行下方。那是为什么?

(PS:我知道有内存泄漏,std :: vector更好......我只是好奇)。

5 个答案:

答案 0 :(得分:5)

不,当你执行int *arrayCopy = array;时,你会在那个时刻将array的价值捕获到arrayCopy ,所以如果你修改了(注意最初array指向某个随机位置,您在复制到{{1} 之后new array ,指向正确的位置然后那些改变的东西不会反映回arrayCopy

答案 1 :(得分:4)

也许您正在考虑使用对指针的引用?以下是您当前代码所发生的情况:

int *array; // Currently points to an undefined (invalid) memory location.
int *arrayCopy = array; // Now this points to the same undefined memory location as array.

array = new int[4]; // Now array points to valid memory, but arrayCopy still points to undefined space.

如果你做了类似的事情,那就不一样了:

int *array; // Points to undefined
int *&arrayCopy = array; // This is a reference to array. That means if you change array, arrayCopy will also reflect the changes.

array = new int[4]; // Now since array points to valid space, arrayCopy does too.

从技术上讲,这并不完全正确,因为正在发生不同的事情。引用本质上与指针的间接级别相同,除了编译器为您执行所有解除引用。但我所描述的基本上是它的工作原理。如果您只是将额外的&添加到那里,那么您的代码将按照您的想法进行操作。

答案 2 :(得分:3)

int *array;                   // array is ???
int *arrayCopy = array;       // copy is ???
array = new int[4];           // array is valid pointer, copy still ???

此代码段执行以下操作:

  • 创建不确定值的int指针(可以是任何内容)。
  • 将不确定值复制到副本。
  • 将原始指针的值更改为指向新创建的数组。

换句话说,第三行“断开”两个指针,使副本仍然指向一个不确定的位置。

取消引用该指针副本是未定义的行为,而不是您想要解决的问题。

相反,如果序列更改为(如您的问题中所述):

int *array;                   // array is ???
array = new int[4];           // array is valid pointer
int *arrayCopy = array;       // copy is now also the valid pointer

然后在初始化原始指向数组后,将复制指针设置为原始。不会发生断开连接,因此array[2]实际上与arrayCopy[2]相同。

答案 3 :(得分:1)

  

是否可以在内存分配之前复制动态分配的数组指针?

没有

但是,你可以这样做:

int *array;
int *&arrayReference = array;

答案 4 :(得分:0)

int *array; // points to some random value
int *arrayCopy = array; // points to the same value

array = new int[4]; // array points to a new value, arrayCopy does not

如果你想制作一个指向任何“数组”指向的指针,请创建一个双指针

http://computer.howstuffworks.com/c32.htm