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

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

它將輸出(null)作爲輸出。 以上是示例代碼。在實際代碼中,我將char *作爲函數的返回值,我希望打印字符串以進行日誌記錄。但是,NULL也是該函數的有效返回值,所以我想知道在打印字符串之前是否需要空檢查?下面的C代碼是否安全?

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

我只是想確保輸出將是相同的,即若ptr = NULL,則輸出應爲(空)的所有平臺和編譯器和上面的代碼(不if語句)不會對任何崩潰C標準兼容平臺。

總之,上面的代碼(沒有if語句)標準是否兼容?

感謝您的幫助和耐心:)

問候

拉利

+0

什麼是''頭文件提供給您的代碼?您的代碼通過將空指針傳遞給不期望的函數來調用未定義的行爲。任何事情都可能發生 - 主要包括可能無意中發生的事情。 – 2010-03-30 13:50:03

+0

好吧,我明白了。謝謝大家對這樣的「實時」幫助:)) – ghayalcoder 2010-03-30 14:17:02

回答

21

總之,是上述代碼(沒有 if語句)標準兼容?

號ISO/IEC 9899:1999(C標準文件)不作任何應該發生什麼,如果ptr是空的,所以行爲是不確定聲明。你使用的庫僅僅是足夠友好的給你一些有用的輸出(「(null)」)而不是崩潰。

包括對NULL的顯式檢查。

5

在疑問,你不應該依賴於實現細節和執行額外的(ptr != NULL)的情況下 - 這也是良好的編碼習慣。

7

你的意思是這樣的嗎?

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

我喜歡這個,謝謝:) – ghayalcoder 2010-03-30 14:17:46

1

根據我的經驗,雖然我傾向於避免做習慣說明中的事情,但通常情況下,您不需要if語句就可以清楚了......這已經很長時間了,但IIRC是我使用的Sun編譯器如果你將一個NULL char *傳遞給printf(),那麼在一些或者所有的時候都會導致崩潰,所以包含這個檢查就更容易和更安全了......我將會拋出關於使用宏觀形式,但我看到自從我開始輸入以來,我在30秒內就被其他3人一直打敗了。:)