2013-05-31 30 views
8

Tôi có đoạn mã này trong C:Tại sao biểu mẫu này đúng trong C?

void f(void *x) { 
    printf(">>> %p\n", x); 
} 

int main() { 

    f NULL; 
    return 0; 
} 

tôi nghĩ là cho định nghĩa của NULL, nhưng tôi muốn một lời giải thích để làm rõ nghi ngờ của tôi.

+0

chính xác bạn không thích gì ở đây? –

+5

iirc NULL là một # define'd đến ((void *) 0), vì vậy khi nó được sao chép trong bạn có f ((void *) 0) hoạt động như một tham số cho hàm – Daboyzuk

+0

là lần đầu tiên tôi thấy điều này loại biểu mẫu 'f NULL'. – Kyrol

Trả lời

9

Nếu NULL được định nghĩa là ((void *)0) hay (0), thì đây mở rộng để f ((void *)0) hoặc f (0), đó là cuộc gọi chức năng phù hợp. Các lỗi mã ra cho bất cứ điều gì không được ngoặc trong quá trình biên dịch.

+0

Tôi đã bỏ phiếu và xóa bỏ phiếu giảm giá của tôi sau khi nhận thấy rằng đó là khoảnh khắc "buổi sáng thứ hai" ... –

+0

@ JohannesSchaub-litb Ah, OK. Tôi hiểu rồi. –

+0

Cảm ơn rất nhiều vì đã giải thích. – Kyrol

2

Trong C NULL thường được định nghĩa như sau:

#if !defined(NULL) 
    #define NULL ((void*)0) 
#endif 

Nếu đây là trường hợp sau đó NULL chỉ là một con trỏ đặc biệt, và bạn ví dụ hoạt động.

+0

Không, tiêu chuẩn C không xác định cách định nghĩa NULL. –

+5

Ngoài ra, 'NULL' không phải là một con trỏ * đến địa chỉ 0 *. Thay vào đó, giá trị * literal 0 *, khi gặp phải trong một bối cảnh con trỏ, là con trỏ null. Giá trị * thực tế * của con trỏ null được thực hiện cụ thể và có thể là bất kỳ thứ gì. – Jon

+2

Đủ công bằng, tiêu chuẩn nói rằng định nghĩa của NULL là thực hiện cụ thể. Tuy nhiên, trong phần 6.3.2.3 phần 3, tại http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf. Nó nói rằng một '0' cast to (void *) được gọi là hằng số null pointer. – jbr

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