Tại sao địa chỉ bộ nhớ 0x0 được đặt trước và để làm gì? Tôi không hiểu chính xác điều gì, cảm ơn bạn đã giúp đỡTại sao địa chỉ bộ nhớ 0x0 được đặt trước và để làm gì?
Trả lời
Chủ yếu là một quy ước và thực hiện cụ thể.
Tiêu chuẩn ngôn ngữ C (C99 hoặc C11) -và một số ngôn ngữ lập trình khác như Lisp- có khái niệm về null pointer mà không thể được dereferenced (đó sẽ là undefined behavior, segmentation fault) và là khác nhau của bất kỳ con trỏ khác (đối với một số vị trí bộ nhớ hợp lệ). Tony Hoare khiêm tốn gọi là khái niệm "my billion dollar mistake" và một số ngôn ngữ (Haskell, Ocaml) có một số loại tagged unions (ví dụ: 'a option
trong Ocaml).
Hầu hết các triển khai (nhưng không phải tất cả) đại diện cho con trỏ null theo địa chỉ 0.
Trong thực tế, trên một máy tính để bàn, máy tính xách tay hoặc máy tính bảng, một chương trình sử dụng chế độ C chạy ở một số nơi virtual address space trang chứa địa chỉ 0 không được ánh xạ. (Trên một số Linux, bạn có lẽ có thể mmap(2) với MAP_FIXED
địa chỉ 0, nhưng đó sẽ là hương vị kém ...)
Trong một số nhúng microcontrollers (ví dụ AVR), địa chỉ 0 có thể được sử dụng.
Về lý thuyết (và trong quá khứ), địa chỉ có thể phức tạp hơn một số ... (vào những năm 1980, ví dụ như x86 memory segmentation trên i286, và iAPX432 giải quyết, Rekursiv kiến trúc, vv ...)
Đọc một số sách và trang web về lập trình C, kiến trúc vi xử lý & instruction sets, operating system nguyên tắc, virtual memory, MMU s.
Một thực tế phổ biến trên hệ thống bộ nhớ phân trang không phải là bản đồ trang đầu tiên (zeroth) theo mặc định. Đây là một quy ước thường được thực thi bởi trình liên kết. Khi trình tải chương trình đọc tệp thi hành, nó không bao giờ nhận được một lệnh để ánh xạ trang logic đầu tiên.
Lý do cho điều này là để phát hiện lỗi con trỏ null.
int *whatever = 0 ;
. . . .
*whatever = 10 ;
sẽ vi phạm quyền truy cập.
Điều đó nói chung, có thể quy trình lập bản đồ trang đầu tiên sau khi bắt đầu thực hiện và trong một số trường hợp, bạn có thể chỉ định tùy chọn trình liên kết cho phép các phần chương trình ở đó.
- 1. Tại sao bộ nhớ byte địa chỉ và không phải bộ nhớ địa chỉ 4 byte?
- 2. Tại sao địa chỉ bộ nhớ bắt đầu bằng 0x?
- 3. Tại sao địa chỉ ảo thực thi ELF có dạng 0x80xxxxx và không phải là 0x0?
- 4. 0xdeadbeef trong địa chỉ 0x0 có nghĩa là gì?
- 5. Tại sao địa chỉ ngăn xếp phát triển theo hướng giảm địa chỉ bộ nhớ?
- 6. C địa chỉ # bộ nhớ và biến
- 7. Tại sao địa chỉ bộ nhớ này có giá trị ngẫu nhiên?
- 8. Tại sao danh mục phần bộ nhớ được đặt trước bằng dấu '.'
- 9. Địa chỉ gọi lại trong C++ là gì và tại sao nó sẽ rò rỉ bộ nhớ?
- 10. Tìm hiểu về MIPS hội .Địa chỉ và bộ nhớ Địa chỉ
- 11. Tại sao apache giữ offsets vào bộ nhớ nơi php-cli giữ địa chỉ bộ nhớ ảo?
- 12. Làm thế nào để dịch địa chỉ bộ nhớ ảo sang địa chỉ thực?
- 13. Tại sao địa chỉ bộ nhớ lại tăng lên 4 trong MIPS?
- 14. làm thế nào để có được địa chỉ bộ nhớ của một mảng NumPy cho C
- 15. Tại sao bộ nhớ được chia thành đống và đống?
- 16. Python3 nhiều nhiệm vụ và bộ nhớ địa chỉ
- 17. Tại sao malloc (0) trả lại địa chỉ bộ nhớ hợp lệ? Việc sử dụng là gì?
- 18. Có thể đặt trước bộ nhớ gây ra ngoại lệ Hết bộ nhớ
- 19. Làm thế nào để thay đổi giá trị được lưu trữ trong địa chỉ bộ nhớ?
- 20. Địa chỉ bộ nhớ truy cập trong C#
- 21. Bất kỳ cách nào để đặt trước nhưng không cam kết bộ nhớ trong linux?
- 22. LLDB Break tại địa chỉ
- 23. Tại sao "Kích thước bộ nhớ được phép cạn kiệt"?
- 24. atomic.AddInt64 Gây ra địa chỉ bộ nhớ không hợp lệ hoặc dilference con trỏ nil
- 25. Bộ nhớ ảo và sbrk
- 26. Tại sao window.name được lưu trong bộ nhớ cache?
- 27. địa chỉ bộ nhớ in của biến số Python
- 28. Làm thế nào để đặt một biến tại một địa chỉ tuyệt đối được đưa ra trong bộ nhớ (với GCC)
- 29. Làm thế nào để tính số bit địa chỉ cần thiết cho bộ nhớ?
- 30. Điều gì quyết định địa chỉ bộ nhớ cho các biến toàn cầu. Trình biên dịch hoặc hệ điều hành?