次のポインターがあります。
jfloat *verticesLocal;
そして、私は新しいコピーを作成したい:
jfloat *vertices;
verticesLocal
からvertices
に値をコピーします。
どうやってやるの?私は次のコマンドを試しましたが、うまくいきません:
memcpy(vertices, verticesLocal, numVerticesLocal * sizeof(jfloat));
Androidネイティブコードで作業しているため、エラーが表示されません。申し訳ありません。
malloc
最初に、次にmemcpy
を実行します。
「ポインタをコピーする」という考えは、文字通り解釈すると、単なる割り当てにすぎません。
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
この考案された例では、ヒープ割り当てを完全に避け、スタック変数のみを使用することが望ましいでしょう。ただし、ヒープに割り当てられたオブジェクトをコピーするという考えは実証されています。
ポインターをコピーする場合、それは簡単な割り当てです。
jfloat* verticesLocal; // assuming is is allocated already
jfloat* newVertices = verticesLocal;
ポイントが指すデータをコピーする場合は、最初に新しいメモリブロックにメモリを割り当てる必要があります。
// jfloat * verticesLocalがサイズiの有効なメモリブロックを指していると仮定します
jfloat* newVertices = new jfloat[i];
memcpy(newVertices, verticesLocal, i * sizeof(jfloat));