Bộ nhớ có thể hoặc không thể chứa 4 khi nó đến dòng cout của bạn. Nó có thể chứa một 4 nghiêm túc do tai nạn. :)
Điều đầu tiên trước tiên: hệ điều hành của bạn chỉ có thể phát hiện truy cập bộ nhớ bị lạc lối trên ranh giới trang. Vì vậy, nếu bạn đang đi bằng 4k hoặc 8k hoặc 16k hoặc nhiều hơn. (Kiểm tra /proc/self/maps
trên một hệ thống Linux một ngày nào đó để xem bố trí bộ nhớ của một quy trình; bất kỳ địa chỉ nào trong phạm vi được liệt kê đều được phép, bất kỳ bên ngoài phạm vi được liệt kê đều không được phép. Vì vậy, hệ điều hành không thể giúp bạn khi dữ liệu của bạn quá nhỏ.
Ngoài ra, int inf = 4;
của bạn cũng có thể được lưu trữ trong các phân đoạn .rodata
, .data
hoặc .text
của chương trình của bạn. Các biến tĩnh có thể được nhồi vào bất kỳ phần nào trong số các phần này (tôi không biết làm thế nào trình biên dịch/trình liên kết quyết định; tôi coi nó là ma thuật) và do đó chúng sẽ hợp lệ trong suốt toàn bộ thời gian của chương trình. Kiểm tra size /bin/sh
lần sau khi bạn sử dụng hệ thống Unix để biết có bao nhiêu dữ liệu được đưa vào phần nào. (Và kiểm tra readelf(1)
cho cách quá nhiều thông tin. objdump(1)
nếu bạn đang ở trên hệ thống cũ.)
Nếu bạn thay đổi inf = 4
để inf = i
, sau đó lưu trữ sẽ được cấp phát trên stack, và bạn đứng một cơ hội tốt hơn để nó bị ghi đè nhanh chóng.
Không có đối tượng được phân bổ tĩnh trong mã của bạn. –
... ngoại trừ cout, tất nhiên :-) –