Không, mã không nên (nhất thiết) đưa ra sự phân đoạn. Một segfault xảy ra khi bạn cố gắng truy cập vào một trang bộ nhớ ảo không được cấp phát cho quá trình của bạn.
"Heap" hoặc "cửa hàng miễn phí" là vùng của các trang bộ nhớ ảo thuộc sở hữu của quy trình của bạn. API malloc()
chia phân vùng này thành các khối và trả về một con trỏ tới khối.
Nếu bạn địa chỉ ngoài phần cuối của khối mà bạn có một con trỏ, bạn thường sẽ truy cập vào bộ nhớ là một phần của đống, nhưng không phải là một phần của khối được phân bổ của bạn. Bằng cách này, bạn có thể làm hỏng các khối heap khác hoặc thậm chí là các cấu trúc dữ liệu mà malloc()
sử dụng để xác định vùng heap.
Để biết thêm thông tin về tham nhũng heap, và phương pháp để phát hiện nó trong phiên bản debug mã của bạn, đây là một cuốn sách tuyệt vời:
Writing Solid Code: Microsoft's Techniques for Developing Bug-Free C Programs by Steve Maguire alt text http://ecx.images-amazon.com/images/I/5148TK6JCVL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
Một phụ lục cho pedantic: Trong những trường hợp hiếm , bằng cách truy cập bộ nhớ ngoài phần cuối của khối heap, bạn có thể truy cập bộ nhớ không phải là một phần của heap. Trong những trường hợp này, bạn có thể gặp lỗi phân đoạn mà bạn mong đợi. Bạn cũng có thể làm hỏng một số cấu trúc dữ liệu khác so với heap. Nó thực sự là một vấn đề của cơ hội. Tuy nhiên, heap chính nó là rất lớn so với khối heap điển hình, do đó, 99% của mã thời gian như ví dụ của bạn sẽ bị hỏng heap. Ví dụ bạn cung cấp rơi vào trường hợp 99% đó.
Nguồn
2009-11-17 19:55:55
Có lẽ chỉ có may mắn. –
Bạn đã viết 5 đến một địa điểm không thuộc về bạn. Nếu chủ nhân của nơi đó không thích những gì bạn đã làm cho nhà của mình, nó sẽ được trả thù. ** Cẩn thận **, nó có thể thuộc về trình điều khiển đĩa USB của bạn và nó sẽ định dạng ổ đĩa tiếp theo bạn đặt vào. – pmg
@pmg: Thực tế, điều đó không có khả năng trên hệ điều hành chế độ bảo vệ hiện đại. – bcat