2015-06-19 97 views
1

我認爲指向NULL的指針可以轉換爲0。所以我寫下面的程序:爲什麼指向NULL-charater的指針未轉換爲false

#include <iostream> 
#include <regex> 
#include <string> 
#include <cstdlib> 

bool is_strtoi(const std::string& str) 
{ 
    char *p; 
    std::strtol(str.c_str(), &p, 10); 
    return *p == '\0'; 
} 

bool is_strtoi1(const std::string& str) 
{ 
    char *p; 
    std::strtol(str.c_str(), &p, 10); 
    return p; //Pointer to NULL should be converted to false; 
} 

int main() 
{ 
    std::string test1("123asd2"); 
    std::string test2("123123"); 
    std::cout << is_strtoi1(test1) << std::endl; 
    std::cout << is_strtoi1(test2) << std::endl; 
    std::cout << "---" << std::endl; 
    std::cout << is_strtoi(test1) << std::endl; //prints 1 
    std::cout << is_strtoi(test2) << std::endl; 
} 

Accroding到標準的4.12節:

零值,空指針值,或空構件指針值 轉換爲false

那麼爲什麼沒有?

+2

我在代碼的任何地方都看不到一個空指針。 – AnT

回答

11

你是一個間接出去的層! 「空指針」和「零/零指針」是兩個不同的東西。

在最基本的:

  • 一個空指針本身所具有的價值爲零。
  • 它不指向其他值爲零的其他對象。

p == 0; // yes 
*p == 0; // no 

事實上,char*指向長度爲0(即{'\0'})的C-串是不是一個空指針;這是一個非常有效的指針。

儘管進一步說,指針可以「具有零值」的概念實際上是一個實現細節。抽象地說,指針不是數字,所以我們不會考慮空指針有一個數值如零。這在介紹nullptr關鍵字時很明顯,該關鍵字不能隱式轉換爲整數。通過消除整個討論關於「零」,我們可以改爲給出如下改進,更合適的例子:

p == nullptr; // yes 
*p == '\0'; // no 
+2

「一個空指針本身的值爲零」=可能是真的,但你不應該再相信了。 p!= nullptr更安全 –

+0

@MartinBeckett:澄清 –

2

你似乎「空指針」將混合了「指針爲NULL」(無論後者手段)。您引用的標準文本沒有提及任何有關「NULL指針」的內容。您引用的文字清楚明確地指出空指針轉換爲false

您發佈的代碼沒有任何空指針,即它沒有任何具有空指針值的指針。您的代碼中的指針p指向str.c_str()緩衝區內的某個有效位置,這意味着p本身不爲空。因此,您的代碼中沒有任何內容會根據標準引用的段落轉換爲false

3

此代碼:

bool is_strtoi1(const std::string& str) 
{ 
    char *p; 
    std::strtol(str.c_str(), &p, 10); 
    return p; //Pointer to NULL should be converted to false; 
} 

僅會返回false如果p地址是NULL。如果strtol的輸入字符串不是NULL [在任何行爲良好的程序中都不會發生std::string - NULLstrtol的輸入是未定義的行爲,所以它沒有被定義爲NULL。在這種情況下爲p - 但很可能你會因這種嘗試而崩潰]。

換句話說,您轉換爲bool的前提不正確。

你可以寫爲:

return *p; 

將返回true,如果在NUL(零)字符p點。

相關問題