web-dev-qa-db-ja.com

あるポインターから別のポインターに値をコピーする方法

次のポインターがあります。

jfloat *verticesLocal;

そして、私は新しいコピーを作成したい:

jfloat *vertices;

verticesLocalからverticesに値をコピーします。

どうやってやるの?私は次のコマンドを試しましたが、うまくいきません:

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

Androidネイティブコードで作業しているため、エラーが表示されません。申し訳ありません。

19
VansFannel

malloc最初に、次にmemcpyを実行します。

15
NPE

「ポインタをコピーする」という考えは、文字通り解釈すると、単なる割り当てにすぎません。

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

この場合、両方のp1およびp2は同じデータを指します-int変数x。ただし、これは非常に簡単なので、実際にが求めているのは、dataポインターが指します。

この場合、データ型に依存します。ポインターが 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

または、バッファに PODs が含まれているため、memcpyを使用してバッファをバイト単位でコピーできます。

memcpy(p2, p1, 100 * sizeof(int));

ただし、ポイント先のデータがnot単純なバッファーではなく、C++オブジェクトである場合、memcpyは使用できません。オブジェクトのクローンを取得するには、(通常はオブジェクトのコピーコンストラクターを使用して)オブジェクトのdeep copyを実行する必要があります。これがどのように行われるか、それが可能かどうかは、オブジェクトによって異なります。 (一部のオブジェクトはコピー不可です。)

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

この考案された例では、ヒープ割り当てを完全に避け、スタック変数のみを使用することが望ましいでしょう。ただし、ヒープに割り当てられたオブジェクトをコピーするという考えは実証されています。

43
Charles Salvia

ポインターをコピーする場合、それは簡単な割り当てです。

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
Zac Howland