2012-04-26 67 views
10

標題可能有點用詞不當......只是因爲我不確定我的char指針是否指向NULL,或者它是否指向一個大小爲0的char數組。如何檢查指針是否指向NULL?

所以我有

char* data = getenv("QUERY_STRING"); 

我想檢查數據是否爲空(或長度爲< 1)。我已經試過:

if(strlen(data)<1) 

,但我得到一個錯誤:

==24945== Invalid read of size 1 
==24945== at 0x8048BF9: main (in /cpp.cgi) 
==24945== Address 0x1 is not stack'd, malloc'd or (recently) free'd 

我也試過

if(data == NULL) 

但具有相同的結果。

這是怎麼回事?我已經嘗試了與數據cout,並且工作正常。我似乎無法檢查它是否爲空或空。

我意識到這些是兩個不同的東西(空和空)。我想知道哪一個數據會在這裏,以及如何檢查它是否爲空/空。

+2

注意:你應該使用'const char *',而不是'char *'。從[(C++)文檔](http://www.cplusplus.com/reference/clibrary/cstdlib/getenv/):'該函數返回的指針所指向的字符串不應該被程序修改。' – Cameron 2012-04-26 20:13:38

回答

21

與getenv,你必須處理這兩種情況! (耶!)如果環境變量沒有設置,那麼函數返回NULL。如果它被設置,那麼你得到一個指向它設置的值的指針,它可能是空的。所以:

const char* data = getenv("QUERY_STRING"); 
if (data != NULL && data[0] != '\0') { 
    // Variable is set to value with length > 0 
    // ... 
} 

顯然,你需要檢查它是否是NULL 試圖確定它的長度或讀取任何它指向的字符之前 - 爲什麼在上面if的兩個條件是有序的,這是他們的方式。

+3

這可以大大減少到'if(data && * data){...}' – Philip 2012-04-26 20:32:01

+5

@Philip:是的,是的,它可以。但哪一個更具可讀性?這是一個意見問題。使用你最喜歡的東西!我個人的偏好是'if(data && data [0]!='\ 0')'。我加了'!= NULL'使我的回答更清晰。 – Cameron 2012-04-26 20:42:59

+0

@Cameron:SO上的一些人宣稱有一些平臺,其中NULL!= 0。另一方面*「零值,空指針值或空成員指針值被轉換爲false;」*。這意味着兩種檢查方式都是有效的。 – SigTerm 2012-04-26 20:54:34

4

通常你會檢查這樣的事情。第一部分檢查指針是否爲空,第二部分通過檢查每個字符串末尾的空終止符的第一個字符來檢查空字符串。

if (data == NULL || data[0] == 0) 

您的問題,看起來像getenvstrlen之間的一些具體的互動,是不是標準。

+0

'getenv'返回一個指向普通的以空字符結尾的C字符串的指針。 'strlen'是爲那些類型的字符串而建立的。 – Cameron 2012-04-26 20:11:42

+0

@Cameron:你能想象零長度的C字符串不以'\ 0'開頭嗎? – SigTerm 2012-04-26 20:14:13

+0

@SigTerm:不可以嗎? – Cameron 2012-04-26 20:14:43