2010-12-10 113 views
17

我有以下指針:如何從一個指針的值複製到另一個

jfloat *verticesLocal; 

而且我希望做一個新副本:

jfloat *vertices; 

我想要的值從verticesLocal複製到vertices

我該怎麼做?我剛剛嘗試了以下命令,但它不起作用:

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

我看不到錯誤,因爲我正在使用Android本機代碼。抱歉。

+0

您是否爲頂點分配空間?你應該事先做過一個calloc或malloc。 – SRM 2010-12-10 16:50:28

+3

複製指針是什麼意思?只需複製價值(地址)或製作任何指向內容的副本? – 2010-12-10 16:51:53

+0

我想將'verticesLocal'中的值複製到'vertices'。 – VansFannel 2010-12-10 16:54:04

回答

14

malloc先,然後做你的memcpy

1

您是否爲vertices分配了內存?如果沒有,您可能會遇到分段錯誤。

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)); 
+0

看到我對Nate的評論,但你在這裏說明的正是淺拷貝和深拷貝之間的區別。取決於您的特定解決方案,可能適用。 – SRM 2010-12-10 17:02:23

+0

@SRM:這就是我提供這兩個示例的原因。 – 2010-12-10 17:14:56

39

的「複製指針」的理念,從字面上理解時,無非是多簡單的任務。

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 

在這個人爲的例子則最好避免堆完全分配,只使用堆棧變量。但它演示了複製堆分配對象的想法。

+0

您提到某些對象是不可複製的,這是什麼時候? – Dennis 2013-08-01 07:18:50

+1

@丹尼斯,如果對象有一個'private'或'delete'd拷貝構造函數,或者包含任何帶有'private'或'delete'd拷貝構造函數的內部數據成員,則該對象不能通過拷貝構造函數複製。這樣一個對象的例子是'std :: fstream';你不能調用'fstream :: fstream(const fstream&)' - 編譯器會產生一個錯誤。然而,在C++ 11中,它可以被移動。 – 2013-08-01 13:04:02

相關問題