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

Van*_*nel 19 c++ pointers android-ndk

我有以下指针:

jfloat *verticesLocal;
Run Code Online (Sandbox Code Playgroud)

我想制作一份新副本:

jfloat *vertices;
Run Code Online (Sandbox Code Playgroud)

我想将值复制verticesLocalvertices.

我怎样才能做到这一点?我刚刚尝试了以下命令,但它不起作用:

memcpy(vertices, verticesLocal, numVerticesLocal * sizeof(jfloat));
Run Code Online (Sandbox Code Playgroud)

我无法看到错误,因为我正在使用Android本机代码.抱歉.

Cha*_*via 43

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

int x = 5;
int* p1 = &x;
int* p2 = p1; // there, we copied the pointer.
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,它取决于数据类型.如果指针指向POD的简单缓冲区,则涉及分配单独的缓冲区,然后使用类似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
Run Code Online (Sandbox Code Playgroud)

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

memcpy(p2, p1, 100 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

但是,如果指向的数据不是简单的缓冲区,而是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
Run Code Online (Sandbox Code Playgroud)

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


NPE*_*NPE 15

malloc首先,然后做你的memcpy.