我有以下指针:
jfloat *verticesLocal;
我想制作一份新副本:
jfloat *vertices;
我想将值从verticesLocal
复制到vertices
。
我该怎么做?我刚刚尝试了以下命令,但它不起作用:
memcpy(vertices, verticesLocal, numVerticesLocal * sizeof(jfloat));
我无法看到错误,因为我正在使用Android本机代码。遗憾。
答案 0 :(得分:43)
从字面上看,“复制指针”的想法只不过是一个简单的任务。
int x = 5;
int* p1 = &x;
int* p2 = p1; // there, we copied the pointer.
在这种情况下,p1
和p2
都指向相同的数据 - 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));