为什么指向 NULL 字符的指针没有转换为 false
Why is a pointer to NULL-charater not converted to false
我认为指向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 == ' ';
}
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部分:
零值、空指针值或空成员指针值为 转换为假
那么为什么没有呢?
你是一层间接的!"空指针"和"指向空/零的指针"是两个不同的东西。
最基本的:
- 空指针本身的值为零。
- 它不指向值为零的其他对象。
p == 0; // yes
*p == 0; // no
实际上,char*
指向长度为 0 的 C 字符串(即 {' '}
) 不是空指针;这是一个完全有效的指针。
不过,更进一步,指针可以"值为零"的概念实际上是一个实现细节。抽象地说,指针不是数字,因此我们不会将空指针视为具有诸如零之类的数值。这在引入不能隐式转换为整数的 nullptr
关键字中很明显。通过删除关于"零"的整个讨论,我们可以给出以下改进的、更合适的例子:
p == nullptr; // yes
*p == ' '; // no
此代码:
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;
}
仅当p
中的地址NULL
时,才会返回false
。如果要strtol
的输入字符串不是NULL
,则保证不会NULL
[在任何行为良好的程序中都不会发生std::string
- 并且NULL
输入到strtol
是未定义的行为,因此没有定义在这种情况下p
会发生什么 - 但您可能会因此类尝试而崩溃]。
换句话说,您转换为bool
的前提是不正确的。
你可以把它写成:
return *p;
如果p
指向 NUL(零)字符,则返回 true。
您似乎将"null 指针"与"指向 NULL 的指针"(无论后者是什么意思)混淆了。您引用的标准文本没有说明任何"指向 NULL 的指针"。您引用的文本清楚地明确表示,空指针已转换为false
。
您发布的代码没有任何空指针,即它没有任何带有空指针值的指针。代码中的指针p
指向str.c_str()
缓冲区内的某个有效位置,这意味着p
本身不为 null。因此,您的代码中没有任何内容会根据标准中引用的段落转换为false
。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 伪造事实↔false
- QueryWorkingSet总是返回false
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将 false 转换为指针类型 void*
- 尝试将字符串变量转换为布尔值会导致 "true" 和 "false" 都等于 0
- tf2_ros::Buffer::canTransform() 为现有转换返回 False
- 防止从false到指针的静默强制转换
- 通过常量字符 * 构造函数将 false 转换为对象
- 如果是字符或字符串返回false,但如果输入不能转换为整数则返回true.c++的while循环
- 为什么指向 NULL 字符的指针没有转换为 false