2010-12-10 65 views
17

我有以下指针:如何从一个指针的值复制到另一个

jfloat *verticesLocal; 

而且我希望做一个新副本:

jfloat *vertices; 

我想要的值从verticesLocal复制到vertices

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

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

我看不到错误,因为我正在使用Android本机代码。抱歉。

+0

您是否为顶点分配空间?你应该事先做过一个calloc或malloc。 – SRM 2010-12-10 16:50:28

+3

复制指针是什么意思?只需复制价值(地址)或制作任何指向内容的副本? – 2010-12-10 16:51:53

+0

我想将'verticesLocal'中的值复制到'vertices'。 – VansFannel 2010-12-10 16:54:04

回答

14

malloc先,然后做你的memcpy

1

您是否为vertices分配了内存?如果没有,您可能会遇到分段错误。

3

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

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

如果你的意思,你想将数据复制点分,你必须分配内存为新的内存块第一:

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

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

看到我对Nate的评论,但你在这里说明的正是浅拷贝和深拷贝之间的区别。取决于您的特定解决方案,可能适用。 – SRM 2010-12-10 17:02:23

+0

@SRM:这就是我提供这两个示例的原因。 – 2010-12-10 17:14:56

39

的“复制指针”的理念,从字面上理解时,无非是多简单的任务。

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 

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

+0

您提到某些对象是不可复制的,这是什么时候? – Dennis 2013-08-01 07:18:50

+1

@丹尼斯,如果对象有一个'private'或'delete'd拷贝构造函数,或者包含任何带有'private'或'delete'd拷贝构造函数的内部数据成员,则该对象不能通过拷贝构造函数复制。这样一个对象的例子是'std :: fstream';你不能调用'fstream :: fstream(const fstream&)' - 编译器会产生一个错误。然而,在C++ 11中,它可以被移动。 – 2013-08-01 13:04:02

相关问题