Hôm nay tôi đã xem xét tình huống sau. Tôi chạy nhiều lần chương trình sau đây:Tại sao địa chỉ của argc khác nhau ở mỗi lần chạy chương trình?
#include <stdio.h>
int main(int argc, char **argv) {
printf("%p\n", &argc);
}
Trên một i7 với Linux và trình biên dịch gcc Intel, chương trình này cung cấp cho đầu ra khác nhau ở mỗi lần chạy:
i7:~/tmp$ gcc t.c
i7:~/tmp$ ./a.out
0x7fffc127636c
i7:~/tmp$ ./a.out
0x7fffdefed97c
i7:~/tmp$ ./a.out
0x7fff7f32454c
Tôi hy vọng rằng các nhà phát triển của Linux, elf , gcc hoặc bất cứ điều gì có liên quan sẽ cố gắng để đảm bảo rằng ngăn xếp được định vị trên cùng một địa chỉ tại mỗi lời gọi của một chương trình. Nó sẽ tạo điều kiện truy tìm và sửa chữa các lỗi lạ có thể xảy ra khi giao dịch với con trỏ và địa chỉ của các biến (tương tự như địa chỉ ảo là tốt hơn để sửa lỗi so với địa chỉ vật lý).
Tôi tự hỏi tại sao ngăn xếp được ánh xạ tới các địa chỉ khác nhau ở mỗi lần gọi chương trình?
https://en.wikipedia.org/wiki/Address_space_layout_randomization? – dbrank0
OT: Nó phải là 'printf ("% p \ n ", (void *) &argc);', BTW. Bộ định danh chuyển đổi 'p' được định nghĩa cho' void'-con trỏ chỉ. – alk
Related: http: // stackoverflow .com/questions/11238457/vô hiệu hóa và bật lại-địa chỉ-không gian-bố cục-ngẫu nhiên-chỉ-cho-bản thân mình – alk