2014-10-01 41 views
-2

下面的代碼不會用C給出錯誤爲什麼一個例子給出一個錯誤,而其他沒有

char * p; 
if (p && *p) then 
foo(); 

但是,下列情況:

char * p; 
if (*p && p) then 
foo(); 

這是否有在調用第二個示例中的正則表達式之前,先取消引用指針?如果是這樣,有人可以解釋爲什麼?

編輯:對不起,我的編程課是一個例子,所以我相信教師冒昧地把then強調錯誤會顯示。我直接從演講幻燈片接過代碼,所以我認爲,重點是基於以下(p && *p)而不是什麼其次

+2

C中沒有'then'關鍵字,你能發佈實際的代碼嗎? – ouah 2014-10-01 17:55:19

+1

「給出錯誤」是什麼意思?編譯器消息?碰撞?不按預期工作? (你期望什麼?)什麼是「調用正則表達式」?而僞代碼對於像這樣的問題並不是真的有用...... – mafso 2014-10-01 17:55:57

+0

好吧,它不是'不','可能不是'是推動者。 「p」不可能被初始化爲「NULL」,所以在第一個例子中,解引用幾乎不會發生。 – HuStmpHrrr 2014-10-01 18:06:08

回答

2

的代碼示例是明顯無效C.正如其他人已經指出,C沒有then關鍵字。這可能只是你的老師的一個錯誤,並不是爲了特別說明任何事情。我將展示類似的例子來說明這一點。

該代碼是正確的:

char *p; 
/* code that assigns a value to p omitted */ 
if (p && *p) 
    foo(); 

任何標量值可被用作一個條件;如果它等於零,則將其視爲false,否則視爲true。 (在原始樣品,p是未初始化,導致未定義的行爲,如果使用它的值,但我會承擔任何初始化代碼簡單地省略)

以上可以更明確地寫成:

char *p; 
/* code that assigns a value to p omitted */ 
if (p != NULL && *p != '\0') 
    foo(); 

如果p是空指針,則評估*p將會失效(導致未定義的行爲)。通過測試p在嘗試解引用之前是否爲空,上述代碼避免了任何此類錯誤,因爲&&具有短路行爲。該if聲明也可以寫爲:

if (p != NULL) { 
    if (*p != '\0') { 
     foo(); 
    } 
}  

該代碼調用函數foo如果p是一個非空指針指向一個非空字符。 (這些是「null」這個詞的兩個不同含義。)如果p意味着指向字符串的指針,那麼p != '\0'意味着它指向的字符串不是空的。

現在第二示例:

char *p; 
/* code that assigns a value to p omitted */ 
if (*p && p) 
    foo(); 

,或者更明確地:

char *p; 
/* code that assigns a value to p omitted */ 
if (*p != '\0' && p != NULL) 
    foo(); 

這會導致不確定的行爲(可能是一個程序崩潰)如果p是空指針。在程序已經崩潰後,檢查p != NULL執行得太晚。

1

爲什麼一個例子,而其他沒有給出一個錯誤?

這是因爲這兩個代碼片段都會調用未定義的行爲。您應該注意到,取消引用未初始化的指針會調用UB。

注:沒有then關鍵字C.

+1

嚴格地說,第一個樣本可能會或可能不會導致取消引用。無論如何,這是UB。 – AlexD 2014-10-01 17:59:46

+0

下來選民照顧解釋? – haccks 2014-10-02 03:54:49

相關問題