2009-08-14 79 views
8

(Tôi biết giá trị rỗng là gì và được sử dụng như thế nào)giá trị nào null thực sự có?

Câu hỏi: OK, hãy nói tham chiếu đến một đối tượng bằng bất kỳ ngôn ngữ nào. Máy tính làm cho một chút ít 32-bit (hoặc kích thước khác, tùy thuộc vào thiết kế của máy tính) không gian trong bộ nhớ cho tham chiếu đó. Bộ nhớ đó có thể được gán cho một giá trị đại diện cho vị trí của đối tượng trong bộ nhớ. Nhưng khi tôi đặt tham chiếu thành null, giá trị thực sự của nó là gì? (các bit riêng lẻ trong tham chiếu được đặt là gì) Các bit có bị xóa không? Nhưng không phải đó cũng là một vị trí trong trí nhớ sao? Làm thế nào để máy tính nói rằng tham chiếu chứa null thay vì một tham chiếu đến một đối tượng?

Tôi biết đây không phải là câu hỏi "quan trọng", nhưng tôi rất tò mò về cách hoạt động của nó.

Thanks guys: D

+0

Xem http://en.wikipedia.org/wiki/Pointer_(computing)#The_null_pointer (nhưng tôi ghét chỉ trích dẫn Wikipedia trong câu trả lời). –

Trả lời

14

Có hai nửa để câu trả lời:

  • giá trị là zero (tức là tất cả các bit trong giá trị bằng không.)
  • zero không bao giờ được coi là một địa chỉ hợp lệ.

Điểm thứ hai là lý do tại sao câu trả lời cho câu hỏi của bạn "Nhưng không phải đó cũng là vị trí trong bộ nhớ?" là "Không" - nó chỉ đơn giản là một quy tắc mà số không được coi là một vị trí bộ nhớ hợp lệ. Cố gắng truy cập nó sẽ gây ra một ngoại lệ.

Chỉnh sửa:According to Wikipedia (vì vậy phải đúng 8-) "một số kiến ​​trúc sử dụng không gian địa chỉ đã ký và sử dụng giá trị âm nhất". Vì vậy, nó không nhất thiết là không trên tất cả các kiến ​​trúc, nhưng bất cứ giá trị nào nó có trên một kiến ​​trúc nhất định, giá trị đó được coi là một vị trí bộ nhớ không hợp lệ.

+2

"nó chỉ đơn giản là một quy tắc mà số không được coi là một vị trí bộ nhớ hợp lệ" <- điều này là không đúng sự thật. Nó hoàn toàn hợp pháp (nếu vô cùng bối rối) để ánh xạ 0 đến một trang hợp lệ trên một số hệ thống. Tuy nhiên, trong trường hợp của C và C++ nói riêng, tiêu chuẩn yêu cầu 0 là một con trỏ không hợp lệ, vì vậy tôi không chắc nó tương tác như thế nào. – Promit

+4

Tiêu chuẩn không yêu cầu không phải là địa chỉ không hợp lệ, nó đòi hỏi bất cứ khi nào bạn so sánh địa chỉ bằng 0, trình biên dịch phải dịch số 0 thành địa chỉ không đúng tiêu chuẩn trên kiến ​​trúc đó. Đó là một sự trùng hợp ngẫu nhiên mà trên x86 Linux trang không hợp lệ cũng là số không, nhưng nó không phải là. – kmm

7

Xuất thân từ một C++ nền độ nét tiêu chuẩn của NULL khi nói về con trỏ là 0. Tôi cho rằng các ngôn ngữ khác làm việc tương tự.

+0

Điều này đúng trong hầu hết các ngôn ngữ và chỉ thực sự khác nhau giữa các CPU/kiến ​​trúc. –

+1

Tôi * mơ hồ * nhớ rằng một số kiến ​​trúc (một biến thể PDP?) Có một con trỏ rỗng * không phải là * null, nhưng chỉ vào một địa chỉ bộ nhớ không kém phần hợp lệ cho dereferencing. Mặc dù Googling tôi không thể tìm thấy tài liệu tham khảo này. –

+2

Đừng nhầm lẫn giá trị của một con trỏ null trong mã C++ của bạn, mà phải bằng 0 cho mỗi phần 4.10/1 của tiêu chuẩn C++ và biểu diễn bên trong của con trỏ null mà trình biên dịch sử dụng, có thể là bất cứ điều gì thuận tiện. –

8

Trong .NET, giá trị null được biểu thị bằng mẫu bit "tất cả 0". Điều này quan trọng, vì nó có nghĩa là tạo một mảng hoặc đối tượng mới chỉ cần xóa bộ nhớ để tạo các giá trị mặc định thích hợp cho tất cả các trường trước khi bắt đầu gọi các hàm tạo, biến khởi tạo biến vv khi thích hợp.

(Tôi đã cố gắng để tìm nơi này được chỉ định, và tôi không cho đến nay ... nhưng đó là thực hiện duy nhất mà làm cho bất kỳ ý nghĩa. Tôi sẽ tiếp tục tìm kiếm.)

+1

Trong Ecma334, p122 nó nói: [Lưu ý: Khởi tạo các giá trị mặc định thường được thực hiện bởi ... khởi tạo bộ nhớ cho tất cả các bit-zero ... lưu ý cuối cùng]. Lưu ý trình độ tiêu biểu và ngữ cảnh [Ghi chú]. –

+1

@ Henk: Đó là C# - Tôi rất cố tình hạn chế bản thân mình.NET thay vì C# :) –

+0

Jon, có vẻ như không chắc rằng một ngôn ngữ cụ thể có thể thực hiện bất kỳ điều này một cách khác nhau. Lưu ý là về 'trình quản lý bộ nhớ'. –

2

Làm cách nào để máy tính biết rằng tham chiếu chứa null thay vì tham chiếu đến đối tượng?

Theo Wikipedia, con trỏ null trong ngôn ngữ nhất định có thể là một địa chỉ cố định trong bộ nhớ, mà chương trình dùng có thể không truy cập, vì vậy nếu một số điểm đối tượng đến địa chỉ này, nó là null, nếu không, nó không phải là.

0

http://googleit1st.com/search?hl=en&q=null+pointer

con trỏ Null hoặc tham chiếu null Null là một giá trị con trỏ đặc biệt (hoặc loại khác của tham chiếu đối tượng) được sử dụng để biểu thị rằng một con trỏ cố ý không trỏ đến (hoặc tham khảo) một đối tượng. Một con trỏ như vậy được gọi là một con trỏ null.1 Nhiều triển khai sử dụng giá trị 0 (tất cả bit 0) để biểu thị con trỏ rỗng, vì đây là phần cuối của không gian địa chỉ của hầu hết CPU (mặc dù một số kiến ​​trúc sử dụng không gian địa chỉ đã ký và sử dụng giá trị âm nhất). Nhiều hệ điều hành tạo ra một ngoại lệ khi một nỗ lực được thực hiện để truy cập vào địa chỉ bộ nhớ này. Một số ngôn ngữ sử dụng danh pháp khác cho một con trỏ như vậy, ví dụ, Pascal, Ruby và Lua sử dụng nil 2, Visual Basic sử dụng Không có gì và Python sử dụng Không. Fortran không coi null là hằng số, mà là một thuộc tính có thể được thiết lập bởi chỉ thị NULLIFY và được thử nghiệm bởi hàm ASSOCIATED. Taken from wikipedia

3

Không phải tất cả ngôn ngữ đều sử dụng một giá trị cụ thể, đôi khi null là một đối tượng. Các ngôn ngữ động thường có một đối tượng toàn cầu đại diện cho null mà các tham chiếu đối tượng được thiết lập khi chúng không có giá trị. Trong những trường hợp này, các cuộc gọi phương thức có thể được thực hiện trên đối tượng null và các phản hồi thích hợp được tạo ra.

Ví dụ trong Ruby có một singleton được gọi là nil và các phương thức phổ biến như hoặc, không? và to_s đều có các cài đặt mặc định thích hợp mà bạn mong đợi nếu chúng được gọi trên đối tượng null.

Trong Java null được chỉ định kỹ trong đặc tả máy ảo. Giá trị thực tế của nó không thực sự được chỉ định, thay vì điều gì sẽ xảy ra khi lệnh mã byte nhìn thấy nó.

Null thường được "xử lý" bằng cách đặt tham chiếu đối tượng để trỏ đến đối tượng nil. Nhưng các ngôn ngữ có abstractions thấp hơn có thể sử dụng zero làm giá trị là một vị trí trong bộ nhớ, nhưng một hệ điều hành dừng chương trình khỏi thực sự viết, thay vì việc bán phá giá lõi hoặc ngăn chặn chương trình.

4

Để trả lời cho C#

CLR có một opcode cho null.

String s = "ff"; 

    s = null; 

tạo IL này

.locals init ([0] string s) 
    IL_0000: nop 
    IL_0001: ldstr  "ff" 
    IL_0006: stloc.0 
    IL_0007: ldnull 
    IL_0008: stloc.0 

như bạn có thể thấy, có một opcode ldnull đó xử lý các giá trị đặc biệt của null

1

Trang đầu tiên của RAM thường được bảo vệ từ người sử dụng không gian chương trình. Bằng cách đó, nếu một lập trình viên quên kiểm tra con trỏ null, chương trình sẽ ít nhất gây ra lỗi trang, khi chương trình tìm cách truy cập vị trí đó.

Vì vậy, trong khi [0x00000000], về mặt kỹ thuật là vị trí bộ nhớ thực, hầu hết các chương trình đều không thể truy cập.

x86 bộ xử lý có bảng đặc biệt ở đó, nếu tôi nhớ chính xác.

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