Подтвердить что ты не робот

Как скопировать значения из одного указателя в другой

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

jfloat *verticesLocal;

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

jfloat *vertices;

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

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

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

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

4b9b3361

Ответ 1

malloc, затем сделайте свой memcpy.

Ответ 2

Идея "копировать указатель", взятая буквально, представляет собой не что иное, как простое назначение.

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

В этом случае оба p1 и p2 указывают на одни и те же данные - переменную 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));

Однако, если указанные данные не являются простым буфером, а скорее объектом С++, вы не можете использовать 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 assignment operator

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

Ответ 3

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

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

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

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

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

Ответ 4

Вы выделили память для vertices? Если нет, вы, вероятно, получите ошибку сегментации.