Chúng ta hãy xem một ví dụ mà bạn CÓ THỂ truy cập bộ nhớ của một biến cục bộ bên ngoài phạm vi của nó.
Ví dụ
#include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12; cout << *address; }
Đầu ra
Điều này có thể cho kết quả -
3 12
Như tôi đã đề cập trước đây, mã này MIGHT hoạt động. Chúng tôi chỉ đơn giản là đọc và ghi vào bộ nhớ ĐÃ SỬ DỤNG là địa chỉ của x. Về cơ bản, bạn đang ở ngoài phạm vi của foo, địa chỉ là một con trỏ đến một vùng bộ nhớ ngẫu nhiên nào đó. Trong ví dụ trên, vùng bộ nhớ đó không tồn tại và không có gì khác đang sử dụng nó vào lúc này. Bạn không vi phạm bất cứ điều gì bằng cách tiếp tục sử dụng nó (bạn sẽ không sử dụng vùng bộ nhớ của tiến trình khác hoặc bất kỳ vùng nhớ trái phép nào khác) và không có gì khác đã ghi đè lên nó. Do đó, số 3 vẫn ở đó.
Trong một chương trình thực, bộ nhớ đó có thể đã được sử dụng lại gần như ngay lập tức và bạn sẽ phá vỡ điều gì đó bằng cách làm như thế này. Những lỗi truy cập bộ nhớ như vậy rất khó theo dõi và tiêu diệt.
Khi bạn trở về từ foo, chương trình sẽ thông báo cho HĐH rằng bộ nhớ của x không còn được sử dụng nữa và nó có thể được gán lại cho một thứ khác. Nếu bạn may mắn và nó được chỉ định lại và hệ điều hành không bắt bạn sử dụng lại nó, thì bạn có thể thoát khỏi nó.