如何将值从一个指针复制到另一个指针

时间:2010-12-10 16:48:45

标签: c++ pointers android-ndk

我有以下指针:

jfloat *verticesLocal;

我想制作一份新副本:

jfloat *vertices;

我想将值从verticesLocal复制到vertices

我该怎么做?我刚刚尝试了以下命令,但它不起作用:

memcpy(vertices, verticesLocal, numVerticesLocal * sizeof(jfloat));

我无法看到错误,因为我正在使用Android本机代码。遗憾。

3 个答案:

答案 0 :(得分:43)

从字面上看,“复制指针”的想法只不过是一个简单的任务。

int x = 5;
int* p1 = &x;
int* p2 = p1; // there, we copied the pointer.

在这种情况下,p1p2都指向相同的数据 - int变量x。但是,因为这是微不足道的,我倾向于认为你真正所询问的是如何复制指针所指向的数据

在这种情况下,它取决于数据类型。如果指针指向PODs的简单缓冲区,则涉及分配单独的缓冲区,然后使用memcpy(或优选std::copy)之类的内容来复制数据。例如:

int* p1 = new int[100];
// ... fill p1 with values
int* p2 = new int[100]; // create a new buffer
std::copy(p1, p1 + 100, p2); // copy the data into p2

或者,您可以使用memcpy逐字节复制缓冲区,因为缓冲区包含PODs

memcpy(p2, p1, 100 * sizeof(int));

但是,如果指向的数据是一个简单的缓冲区,而是一个C ++对象,则不能使用memcpy。您需要执行对象的深层复制(通常使用对象的复制构造函数)来获取对象的克隆。如何做到这一点,或者它是否可能,取决于对象。 (有些对象是不可复制的。)

我不知道jfloat是什么,但如果对象是std::string,那么你可以这样做:

std::string* s1; // assume this points to a valid string
std::string* s2 = new std::string();
*s2 = *s1; // copies s1 using s2's assignment operator

在这个人为的例子中,最好完全避免堆分配,只使用堆栈变量。但它证明了复制堆分配对象的想法。

答案 1 :(得分:15)

首先

malloc,然后执行memcpy

答案 2 :(得分:4)

如果要复制指针,则这是一个简单的任务:

jfloat* verticesLocal; // assuming is is allocated already
jfloat* newVertices = verticesLocal;

如果您的意思是要复制点指向的数据,则必须首先为新的内存块分配内存:

//假设jfloat * verticesLocal指向大小为i的有效内存块

jfloat* newVertices = new jfloat[i];
memcpy(newVertices, verticesLocal, i * sizeof(jfloat));