Van*_*nel 19 c++ pointers android-ndk
我有以下指针:
jfloat *verticesLocal;
Run Code Online (Sandbox Code Playgroud)
我想制作一份新副本:
jfloat *vertices;
Run Code Online (Sandbox Code Playgroud)
我想将值复制verticesLocal到vertices.
我怎样才能做到这一点?我刚刚尝试了以下命令,但它不起作用:
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)
在这种情况下,既p1与p2指向相同的数据-的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)
在这个人为的例子中,最好完全避免堆分配,只使用堆栈变量.但它证明了复制堆分配对象的想法.