我认为指向NULL
的指针可以转换为0
。所以我写了以下程序:
#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;
}
符合标准的4.12部分:
零值,空指针值或空成员指针值 转换为假
那为什么不呢?
答案 0 :(得分:11)
你是一个间接的层! “空指针”和“指向null / 0的指针”是两回事。
最基本的:
p == 0; // yes
*p == 0; // no
实际上,指向长度为0的C字符串的char*
(即{'\0'}
)不是空指针;它是一个完全有效的指针。
更进一步,指针可以“具有零值”的概念实际上是一个实现细节。在抽象术语中,指针不是数字,因此我们不会将空指针视为具有诸如零的数值。这在引入无法隐式转换为整数的nullptr
关键字时很明显。通过删除关于“零”的整个讨论,我们可以提供以下改进的,更合适的示例:
p == nullptr; // yes
*p == '\0'; // no
答案 1 :(得分: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
。如果NULL
的输入字符串不是strtol
[在任何行为良好的程序中NULL
都不会发生 - 并保证不是std::string
,并且NULL
到strtol
的输入是未定义的行为,因此没有定义p
在这种情况下会发生什么 - 但很可能是你从这种尝试中崩溃了。“
换句话说,转换为bool
的前提是不正确的。
你可以把它写成:
return *p;
如果p
指向零(零)字符,则返回true。
答案 2 :(得分:2)
您似乎将“空指针”与“指向NULL的指针”混合在一起(无论后者是什么意思)。您引用的标准文本没有说明任何“NULL指针”。您引用的文字清楚明确地说明空指针已转换为false
。
您发布的代码没有任何空指针,即它没有任何带有空指针值的指针。代码中的指针p
指向str.c_str()
缓冲区内的某个有效位置,这意味着p
本身不为空。因此,您的代码中没有任何内容可以根据标准的引用段落转换为false
。