Trả lời

2

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.

1

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 ở đó.

Các vấn đề liên quan