【问题标题】:How to copy values from one pointer to another如何将值从一个指针复制到另一个
【发布时间】:2011-05-23 14:40:55
【问题描述】:

我有以下指针:

jfloat *verticesLocal;

我想制作一个新副本到:

jfloat *vertices;

我想将verticesLocal 中的值复制到vertices

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

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

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

【问题讨论】:

  • 你为顶点分配空间了吗?您应该事先在某个地方完成了 calloc 或 malloc。
  • 复制指针是什么意思?只需复制值(地址)或复制所指向的内容吗?
  • 我想将verticesLocal中的值复制到vertices
  • verticesLocal 指向的值指向vertices 指向的位置?如果是这样,并且它们都指向足够大小和对齐的内存,那么您的 memcpy 调用是正确的。
  • 正如@aix 和@lijie 所建议的那样,当我在memcpy 之前执行malloc 时,它可以完美运行。

标签: c++ pointers android-ndk


【解决方案1】:

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

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

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

【讨论】:

  • 你提到有些对象是不可复制的,什么时候会这样?
  • @Dennis,如果对象具有privatedeleted 复制构造函数,或包含具有privatedeleted 复制构造函数的任何内部数据成员,则无法复制该对象通过复制构造函数。这种对象的一个​​例子是std::fstream;你不能调用fstream::fstream(const fstream&) - 编译器会产生一个错误。但是,在 C++11 中,它可以移动。
【解决方案2】:

如果是复制指针,就是简单的赋值:

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

如果您的意思是要复制点指向的数据,则必须先为新的内存块分配内存:

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

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

【讨论】:

  • 请参阅我对 Nate 的评论,但您在这里说明的正是浅拷贝和深拷贝之间的区别。根据您的特定解决方案,任何一个都可能适用。
  • @SRM:这就是我提供这两个示例的原因。
【解决方案3】:

首先是malloc,然后是memcpy

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2019-09-27
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多