2013-01-13 21 views
6

Tôi đã có một con trỏ đến một cấu trúc với một liên minhsao chép trên dữ liệu từ một công đoàn trong C

vì vậy hãy nói rằng chúng ta có

struct A { 
    union { 
    char **word; 
    struct A *B 
    } u; 
}; 

và tôi có các biến x và y của loại A *

typedef A* A_t; 
A_t x; 
A_t y; 

sẽ x-> u = y-> u đủ để sao chép qua nội dung trong công đoàn.

+3

tuyên bố đó sẽ gây segfault cho chắc chắn! –

+0

BTW: 'typedef A * A_t;' là một lỗi cú pháp trong C. Bạn đang sử dụng trình biên dịch C++? BTW2: con trỏ typedeffing nên được coi là một thói quen xấu. – wildplasser

Trả lời

4

Bạn không thể chỉ là con trỏ dereference nếu họ không trỏ đến bất cứ điều gì hợp lệ.
Để có thể thực hiện x->u, bạn phải đảm bảo rằng x trỏ đến một số bộ nhớ hợp lệ, Mã bạn hiển thị dereferences con trỏ chưa được khởi tạo gây ra Hành vi không xác định và rất có thể là sự cố. Tương tự áp dụng cho y->u. Vì vậy, hãy chắc chắn rằng xy trỏ tới bộ nhớ hợp lệ trước khi bạn cân nhắc chúng.

x->u = y->u 

Sẽ không thực hiện một bản sao sâu nhưng một bản sao cạn.
Về cơ bản bạn sẽ kết thúc với hai con trỏ trỏ tới cùng một bộ nhớ, đó không phải là những gì bạn có ý định hoặc cần.

Nếu bạn cần bản sao sâu, bạn nên cấp phát đủ bộ nhớ đích để giữ dữ liệu được sao chép vào bộ nhớ và sau đó sử dụng memcpy để sao chép nội dung của liên kết nguồn vào nó.

Tốt đọc:
What is the difference between a deep copy and a shallow copy?

+1

Bạn nên phân bổ một số không gian cho x và y để trỏ đến, trước tiên. –

+0

@CarlNorum: Hmm, Ofcourse, tôi giả định OP sẽ làm như vậy.Tất cả các từ khi bạn đưa nó lên tôi sẽ thêm một lưu ý về nó. –

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