Là một con trỏ trỏ đến 0x0000 giống như một con trỏ được đặt thành NULL? Nếu giá trị NULL được xác định trong ngôn ngữ C, thì vị trí đó sẽ dịch về vị trí nào? Có phải nó giống như 0x0000. Tôi có thể tìm thêm chi tiết về các khái niệm này ở đâu?
Là một con trỏ trỏ đến 0x0000 giống như một con trỏ được đặt thành NULL? Nếu giá trị NULL được xác định trong ngôn ngữ C, thì vị trí đó sẽ dịch về vị trí nào? Có phải nó giống như 0x0000. Tôi có thể tìm thêm chi tiết về các khái niệm này ở đâu?
Câu trả lời:
Một điểm mà hầu hết các câu trả lời ở đây không giải quyết, ít nhất là không rõ ràng, đó là con trỏ null là một giá trị tồn tại trong khi thực hiện và hằng số con trỏ null là cấu trúc cú pháp tồn tại trong mã nguồn C.
Một hằng con trỏ null , là câu trả lời của Karlson khẳng định một cách chính xác, hoặc là một biểu thức hằng số nguyên với giá trị 0 (đơn giản 0
là ví dụ phổ biến nhất), hoặc như một dàn diễn viên biểu thức để void*
(như (void*)0
).
NULL
là một macro, được định nghĩa trong <stddef.h>
và một số tiêu đề tiêu chuẩn khác, mở rộng thành một định nghĩa triển khai hằng số con trỏ null . Việc mở rộng thường là 0
hoặc ((void*)0)
(các dấu ngoặc đơn bên ngoài là cần thiết để đáp ứng các quy tắc ngôn ngữ khác).
Vì vậy, một nghĩa đen 0
, khi được sử dụng trong một ngữ cảnh đòi hỏi một biểu thức của loại con trỏ, luôn luôn ước lượng thành một null pointer
giá trị con trỏ duy nhất trỏ đến không có đối tượng. Điều đó không ngụ ý bất cứ điều gì về đại diện của một con trỏ null . Con trỏ Null thường được biểu diễn dưới dạng all-bit-zero, nhưng chúng có thể được biểu diễn dưới dạng mọi thứ. Nhưng ngay cả khi một con trỏ null được biểu diễn dưới dạng 0xDEADBEEF
, 0
hoặc (void*)0
vẫn là một con trỏ null không đổi .
Câu trả lời cho câu hỏi trên stackoverflow bao gồm điều này tốt.
Điều này ngụ ý, trong số những thứ khác, memset()
hoặc calloc()
, có thể đặt một vùng bộ nhớ thành all-bit-zero, sẽ không nhất thiết đặt bất kỳ con trỏ nào trong vùng đó thành con trỏ null. Họ có khả năng làm như vậy trên hầu hết các triển khai, nhưng ngôn ngữ không đảm bảo điều đó.
Tôi không biết tại sao câu hỏi này không được coi là một bản sao của câu hỏi này hoặc làm thế nào nó có chủ đề ở đây.
NULL
hoặc bất kỳ con trỏ null nào cho một đối tượng con trỏ đặt giá trị của đối tượng đó thành một con trỏ null . Ở cấp độ máy, nó cũng có thể trỏ đến một số bộ nhớ hợp lệ. Hủy bỏ hội nghị một con trỏ null có hành vi không xác định; truy cập một đoạn bộ nhớ tại địa chỉ 0x0000000
là hành vi hợp lệ, theo nghĩa đen là bất cứ điều gì khác. Địa chỉ đó khác với bất kỳ địa chỉ nào khác bởi (a) so sánh bằng NULL
và (b) so sánh không bằng nhau với bất kỳ con trỏ nào với đối tượng C. Một con trỏ null là một giá trị con trỏ tùy ý được sử dụng để chỉ ra rằng nó không trỏ đến bất cứ thứ gì.
Mọi nền tảng ngoài kia đều miễn phí để định nghĩa NULL khi nó vừa ý.
Theo Tiêu chuẩn C, nếu bạn gán 0 cho một con trỏ, nó sẽ được chuyển đổi thành giá trị NULL (cho nền tảng đó.) Tuy nhiên, nếu bạn lấy một con trỏ NULL và chuyển nó thành int, không có gì đảm bảo rằng bạn sẽ nhận được 0 trên mọi nền tảng ngoài kia. Tuy nhiên, thực tế là trên hầu hết các nền tảng, nó sẽ bằng không.
Thông tin về những thứ mà bạn có thể tìm thấy trong C Language Specification . Một nguồn, sự đáng tin cậy mà tôi không thể đảm bảo, đó là: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
NULL pointer constant
. Theo như tôi biết thì không có trình biên dịch nào ngoài đó làm được điều đó.
NULL
macro, phải mở rộng sang 0
C ++ và 0
hoặc (void *)0
trong C, bởi vì đó là "hằng con trỏ null" thực sự.
Nó được định nghĩa trong ngôn ngữ C bởi vì không có địa chỉ máy nào khác mà nó tương đương. Nếu có, chúng ta sẽ không cần một sự trừu tượng từ nó! Mặc dù trên hầu hết các nền tảng, NULL cuối cùng có thể được triển khai dưới dạng 0 hoặc loại khác, nhưng thật sai lầm khi cho rằng điều này là phổ biến vì vậy, nếu bạn quan tâm đến tính di động.
Theo phần Tài liệu tiêu chuẩn C6.3.2.3
:
Một biểu thức hằng số nguyên có giá trị 0 hoặc một biểu thức được tạo thành kiểu void *, được gọi là hằng số con trỏ null.55) Nếu hằng số con trỏ null được chuyển đổi thành loại con trỏ, con trỏ kết quả, được gọi là con trỏ null, là đảm bảo so sánh không bằng một con trỏ với bất kỳ đối tượng hoặc chức năng nào.
Cho đến nay tôi đã không thấy một trình biên dịch đã phá vỡ điều này.