2010-12-10 47 views
17

Tôi có con trỏ sau:Làm thế nào để sao chép giá trị từ một con trỏ đến một

jfloat *verticesLocal; 

Và tôi muốn tạo một bản sao mới:

jfloat *vertices; 

Tôi muốn sao chép các giá trị từ verticesLocal để vertices.

Tôi có thể làm như thế nào? Tôi vừa thử lệnh sau, nhưng nó không hoạt động:

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

Tôi không thể thấy lỗi vì tôi đang làm việc với mã gốc Android. Lấy làm tiếc.

+0

Bạn đã phân bổ không gian cho các đỉnh? Bạn nên đã thực hiện một calloc hoặc malloc trước một nơi nào đó. – SRM

+3

Bạn có ý gì khi sao chép một con trỏ? Chỉ cần sao chép giá trị (địa chỉ) hoặc tạo một bản sao nội dung của bất kỳ thứ gì được trỏ tới? –

+0

Tôi muốn sao chép các giá trị từ 'verticesLocal' sang' vertices'. – VansFannel

Trả lời

14

malloc trước tiên, sau đó thực hiện memcpy.

1

Bạn đã cấp phát bộ nhớ cho vertices? Nếu không, bạn có thể nhận được lỗi phân đoạn.

3

Nếu bạn đang sao chép các con trỏ, nó là một nhiệm vụ đơn giản:

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

NẾU bạn có nghĩa là bạn muốn sao chép dữ liệu các điểm điểm đến, bạn phải cấp phát bộ nhớ cho các khối mới của bộ nhớ đầu tiên:

// giả jfloat * verticesLocal được trỏ đến một khối bộ nhớ có giá trị kích thước i

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

Xem nhận xét của tôi về Nate, nhưng những gì bạn minh họa ở đây chính xác là sự khác biệt giữa bản sao nông và bản sao sâu. Tùy thuộc vào giải pháp cụ thể của bạn hoặc là có thể được áp dụng. – SRM

+0

@ SRM: Đó là lý do tại sao tôi cung cấp cả hai ví dụ. –

39

ý tưởng về "sao chép một con trỏ", khi hiểu theo nghĩa đen, là không có gì hơn một phân công đơn giản.

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

Trong trường hợp này, cả hai p1p2 điểm đến cùng một dữ liệu - các int biến x. Tuy nhiên, bởi vì điều này rất tầm thường, tôi có xu hướng nghĩ rằng những gì bạn thực sự là đang hỏi về cách sao chép dữ liệu mà con trỏ trỏ đến.

Trong trường hợp này, nó phụ thuộc vào loại dữ liệu. Nếu con trỏ trỏ đến một bộ đệm đơn giản của PODs, điều này liên quan đến việc phân bổ một bộ đệm riêng biệt, và sau đó sử dụng một cái gì đó như memcpy (hoặc tốt hơn là std::copy) để sao chép dữ liệu. Ví dụ:

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 

Hoặc, bạn có thể sử dụng memcpy để sao chép các bộ đệm byte-by-byte, vì bộ đệm chứa PODs.

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

Tuy nhiên, nếu nhọn để dữ liệu là không một bộ đệm đơn giản, nhưng thay vì một đối tượng C++, bạn có thể không sử dụng memcpy. Bạn cần phải thực hiện một bản sao sâu của đối tượng, (thường sử dụng hàm tạo bản sao của đối tượng) để nhận bản sao của đối tượng. Làm thế nào điều này được thực hiện, hoặc cho dù nó thậm chí có thể, phụ thuộc vào đối tượng. (Một số đối tượng không thể sao chép được.)

tôi không có đầu mối những gì một jfloat, nhưng nếu đối tượng là, ví dụ, một std::string, bạn sẽ chỉ làm điều gì đó như:

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 

Trong ví dụ giả tạo này nó sẽ là thích hợp hơn để tránh phân bổ đống hoàn toàn, và chỉ sử dụng các biến stack. Nhưng nó thể hiện ý tưởng sao chép một đối tượng phân bổ đống.

+0

Bạn đã đề cập rằng một số đối tượng không thể sao chép được, khi nào trường hợp này xảy ra? – Dennis

+1

@Dennis, nếu đối tượng có một 'private' hoặc' delete'd copy constructor, hoặc chứa bất kỳ thành viên dữ liệu nội bộ nào với 'private' hoặc' delete'd copy constructors, thì đối tượng không thể được sao chép thông qua hàm tạo bản sao. Một ví dụ về đối tượng như vậy là 'std :: fstream'; bạn không thể gọi 'fstream :: fstream (const fstream &)' - trình biên dịch sẽ tạo ra lỗi. Tuy nhiên, trong C++ 11 nó có thể được di chuyển. –

Các vấn đề liên quan