2011-08-16 30 views
5

tôi nhận được vấn đề với các loại mã sau đây:Sử dụng một con trỏ sau khi giải phóng nó sử dụng miễn phí()

int* myPointer1 = malloc(50 * sizeof(int)); 
int* myPointer2 = malloc(50 * sizeof(int)); 
free(myPointer1); 
myPointer1 = myPointer2; 
myPointer1[0] = 3; 

Tôi nhận được một lỗi phân khúc. Có chuyện gì vậy?

+5

bạn đã kiểm tra để đảm bảo rằng các hoạt động malloc đã thành công? bạn có thể gán myPointer1 cho NULL nếu không. – djhaskin987

+0

Nơi nào bạn segfault? Tại 'free (myPointer1)' hoặc trên 'myPointer1 [0] = 3'? – Seth

+0

Nếu 'malloc' thành công thì không nên có segfault. Tất cả những gì bạn đang làm là giải phóng bộ nhớ tại vị trí bộ nhớ gốc của 'myPointer1', sau đó gán lại' myPointer1' với vị trí 'myPointer2'. Lưu ý, tuy nhiên, nếu bạn định giải phóng bộ nhớ cuối cùng, bạn sẽ chỉ muốn giải phóng một trong các con trỏ (tức là 'myPointer1' OR' myPointer2') vì chúng trỏ đến cùng một địa chỉ. – RageD

Trả lời

3

Sự cố không nằm trong mã này. Đoạn trích bạn đã đăng có vẻ chính xác và hoạt động tốt trong sự cô lập.

+0

Đoạn mã là chính xác bởi vì nó là chính xác, nó không phải là chính xác bởi vì nó hoạt động, Nó rất có thể làm việc ngay cả với một UB và thổi lên tại thời điểm một ít nhất là mong đợi nó. –

+2

"Đoạn mã là chính xác bởi vì nó là chính xác" -> http://xkcd.com/703/ =) – jadarnel27

+2

Tôi đã không nói nó là chính xác bởi vì nó làm việc - Tôi nói nó có vẻ là chính xác (ví dụ, nó không chứa các hành vi không xác định rõ ràng), * và * nó hoạt động (ví dụ, tôi không nhận được báo cáo lỗi phân đoạn được báo cáo). – duskwuff

2

Mã của bạn đúng là không có gì sai, nhưng bạn có thói quen kiểm tra giá trị trả về của hàm malloc(), nếu NULL, nó sẽ tạo ra vấn đề trong chương trình của bạn, trong trường hợp của chúng ta cấp phát bộ nhớ Hàm malloc() bị lỗi

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