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

新手上路,请多包涵

我有以下指针:

 jfloat *verticesLocal;

我想制作一个新副本到:

 jfloat *vertices;

我想将值从 verticesLocal 复制到 vertices

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

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

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

原文由 VansFannel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

malloc 首先,然后做你的 memcpy

原文由 NPE 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

 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 逐字节复制缓冲区,因为缓冲区包含 POD

 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

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

原文由 Charles Salvia 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏