Как скопировать значения из одного указателя в другой - PullRequest
19 голосов
/ 10 декабря 2010

У меня есть следующий указатель:

jfloat *verticesLocal;

И я хочу сделать новую копию:

jfloat *vertices;

Я хочу скопировать значения из verticesLocal в vertices.

Как я могу это сделать? Я только что попробовал следующую команду, но она не работает:

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

Я не вижу ошибки, потому что я работаю с собственным кодом Android. К сожалению.

Ответы [ 3 ]

43 голосов
/ 10 декабря 2010

Идея «копирования указателя», если понимать ее буквально, является не чем иным, как простым присвоением.

int x = 5;
int* p1 = &x;
int* p2 = p1; // there, we copied the pointer.

В этом случае и 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

Или, вы можете использовать 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

В этом надуманном примере было бы предпочтительнее вообще избежать выделения кучи и просто использовать переменные стека.Но это демонстрирует идею копирования выделенного кучи объекта.

15 голосов
/ 10 декабря 2010

malloc сначала, потом сделай свой memcpy.

4 голосов
/ 10 декабря 2010

Если вы копируете указатель, это простое назначение:

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

Если вы хотите скопировать данные, на которые указывает точка, вы должны выделить память для нового блокасначала память:

// предположим, что jfloat * verticesLocal указывает на действительный блок памяти размером i

jfloat* newVertices = new jfloat[i];
memcpy(newVertices, verticesLocal, i * sizeof(jfloat));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...