2011-09-30 55 views

Trả lời

7

ISO/IEC 9899: tiểu bang TC2 trong 6.3.2.3 Pointers

3 Một số nguyên biểu hiện liên tục với giá trị 0, hoặc như một dàn diễn viên biểu gõ void *, được gọi là một con trỏ constant.55 null) Nếu một null con trỏ hằng được chuyển đổi sang một kiểu con trỏ, kết quả con trỏ, được gọi là một con trỏ null, được đảm bảo để so sánh không công bằng để một con trỏ cho bất kỳ đối tượng hoặc chức năng

các NULL vĩ mô mở rộng đến một hằng số null được xác định được xác định null.

Bất kỳ hai con trỏ null nào sẽ được so sánh bằng nhau.

6

Có. Tiêu chuẩn quy định rằng NULL luôn trỏ đến bộ nhớ không hợp lệ. Nhưng nó không nói rằng biểu diễn số nguyên của con trỏ phải là 0. Tôi chưa bao giờ bắt gặp một thực thi mà NULL khác 0, nhưng đó không phải là bắt buộc theo tiêu chuẩn.

Lưu ý rằng gán chữ số 0 cho con trỏ không có nghĩa là con trỏ giả định biểu diễn số nguyên bằng 0. Điều đó có nghĩa là giá trị con trỏ null đặc biệt được gán cho biến con trỏ.

+1

có liên quan: http://c-faq.com/null/machexamp.html – nos

+7

Cũng lưu ý rằng 'int * ptr = 0;' luôn dẫn đến con trỏ null nhờ quy tắc đặc biệt, vì '0' là một cái gọi là "hằng số con trỏ null". Điều này giữ ngay cả khi bạn đang thực hiện một số đặc biệt trong đó một con trỏ null khác với địa chỉ 0. Tuy nhiên, 'int i = 0; int * ptr = (int *) i; 'không nhất thiết dẫn đến một con trỏ null. Vì vậy, bạn sẽ không bình thường gặp phải "một con trỏ trỏ đến địa chỉ 0" ngoại trừ trong một bối cảnh mà nó là một con trỏ null, nhưng tiêu chuẩn cho phép nó. –

+0

@David, trong đoạn thứ hai của bạn, bạn có nghĩa là "không", phải không? Và 'NULL' luôn là giá trị' 0' theo định nghĩa của tiêu chuẩn, có thể là địa chỉ hợp lệ, ví dụ: trong hạt nhân. Vì vậy, một tốt hơn nên phân biệt 'NULL' rõ ràng hơn từ biểu diễn bên trong của một con trỏ null, mà, như bạn nói có thể là một cái gì đó khác nhau. –

3

Đánh giá chữ cái 0 trong ngữ cảnh con trỏ giống hệt với NULL. Bất kỳ mẫu bit nào trình biên dịch sử dụng để biểu diễn con trỏ NULL đều bị ẩn.

1

Câu hỏi thường gặp về comp.lang.c cũ có phần lớn trên con trỏ rỗng và nó đáng để đọc.

comp.lang.c null pointers

0

Ý tưởng là một con trỏ NULL bằng cách nào đó phải đại diện cho một vùng nhớ đó là không hợp lệ.
Vì vậy, trong phân đoạn bộ nhớ thấp hơn mã OS được ánh xạ, giá trị 0 đã được sử dụng (để biểu thị con trỏ NULL) vì vùng này trong bộ nhớ không thuộc về chương trình của người dùng nhưng được ánh xạ tới mã OS.

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