2010-03-30 38 views
11
#include<cstdio> 
#include<stdlib.h> 

int main() 
{ 
    char* ptr=NULL; 
    printf("%s",ptr); 
    return 0; 
} 

Nó in (null) làm đầu ra. Ở trên là mã mẫu. Trong mã thực tôi nhận được char * như là một sự trở lại của một chức năng và tôi muốn in chuỗi ký tự để đăng nhập. Tuy nhiên, NULL cũng là một giá trị trả về hợp lệ của hàm đó và vì vậy tôi tự hỏi nếu một kiểm tra null là cần thiết trước khi in chuỗi ký tự?Mã C sau có an toàn không?

char* ptr=someFuncion(); 
// do i need the following if statement? 
if(ptr!=NULL) 
{ 
    printf("%s",ptr); 
} 

Tôi chỉ muốn chắc chắn rằng sản lượng sẽ được cùng tức là nếu ptr = NULL thì đầu ra nên (null) trên tất cả các nền tảng và trình biên dịch và các mã trên (không có câu lệnh if) sẽ không sụp đổ vào bất kỳ C nền tảng tương thích tiêu chuẩn.

Tóm lại, mã ở trên (nếu không có câu lệnh if) có tương thích chuẩn không?

Nhờ sự giúp đỡ của bạn và sự kiên nhẫn :)

Trân

lali

+0

Tiêu đề '' cung cấp cho mã của bạn là gì? Mã của bạn gọi hành vi không xác định bằng cách chuyển một con trỏ null tới một hàm không mong đợi một hàm. Bất cứ điều gì có thể xảy ra - bao gồm nó có thể vô tình làm việc, chủ yếu. –

+0

ok, tôi hiểu rồi. Cảm ơn tất cả vì sự giúp đỡ "thời gian thực" đó :)) – ghayalcoder

Trả lời

21

Nói tóm lại, là đoạn mã trên (không có câu lệnh if) tiêu chuẩn tương thích?

số ISO/IEC 9899: 1999 (tài liệu tiêu chuẩn C) làm cho không có tuyên bố về những gì sẽ xảy ra nếu ptr là NULL, vì vậy hành vi này là không xác định . Thư viện mà bạn sử dụng chỉ đơn thuần là đủ thân thiện để cung cấp cho bạn một số đầu ra hữu ích ("(null)") thay vì bị lỗi.

Bao gồm kiểm tra rõ ràng cho NULL.

5

Trong trường hợp nghi ngờ bạn không nên dựa vào chi tiết thực hiện và thực hiện thêm một (ptr != NULL) - nó cũng thực hành mã hóa tốt.

7

Bạn có ý nghĩa như thế này không?

 
    char* result = foo(); 
    printf ("result is %s\n", (result ? result : "NULL")); 
+0

tôi thích cái này, cảm ơn :) – ghayalcoder

1

Thông thường bạn sẽ ở trong tình trạng rõ ràng nếu không có tuyên bố, theo kinh nghiệm của tôi, mặc dù tôi có xu hướng tránh làm những gì bạn minh họa trong thói quen ... đã lâu rồi, nhưng trình biên dịch Mặt trời IIRC tôi đã sử dụng để làm việc với sẽ dẫn đến một vụ tai nạn một số hoặc tất cả các thời gian nếu bạn thông qua một NULL char * vào printf(), do đó, nó chỉ dễ dàng hơn và an toàn hơn để bao gồm kiểm tra ... Tôi sẽ ném vào lưu ý về việc sử dụng dạng macro, nhưng tôi thấy tôi đã bị đánh đập bởi 3 người khác trong 30 giây kể từ khi tôi bắt đầu nhập này :)