【问题标题】:Why is a pointer to NULL-charater not converted to false为什么指向 NULL 字符的指针未转换为 false
【发布时间】:2015-06-19 18:16:28
【问题描述】:

我认为指向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 部分:

零值、空指针值或空成员指针值是 转为假

那为什么没有呢?

【问题讨论】:

  • 我在你的代码中没有看到一个空指针。

标签: c++ pointers


【解决方案1】:

你是间接层了! “空指针”和“指向空/零的指针”是两个不同的东西。

最基本的:

  • 空指针本身的值为零。
  • 它不指向其他值为零的对象。

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

确实,指向长度为 0 的 C 字符串(即 {'\0'})的 char* 不是空指针;这是一个完全有效的指针。

不过,更进一步,指针可以“具有零值”的概念实际上是一个实现细节。在抽象的术语中,指针不是数字,因此我们不应认为空指针具有诸如零之类的数值。这在不能隐式转换为整数的 nullptr 关键字的引入中很明显。通过删除关于“零”的整个讨论,我们可以改为给出以下改进的更合适的示例:

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

【讨论】:

  • “空指针本身的值为零” = 可能是真的,但你不应该再相信这一点。 p!=nullptr 更安全
  • @MartinBeckett:澄清
【解决方案2】:

这段代码:

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 [在任何行为良好的程序中std::string 不会发生这种情况,并且NULL 的输入到@987654330,则保证不是NULL @ 是未定义的行为,因此未定义在这种情况下 p 会发生什么 - 但您可能会因这种尝试而崩溃]。

换句话说,您转换为bool 的前提是不正确的。

你可以这样写:

 return *p;

如果p 指向一个 nul(零)字符,则返回 true。

【讨论】:

    【解决方案3】:

    您似乎将“空指针”与“指向 NULL 的指针”混为一谈(无论后者是什么意思)。您引用的标准文本没有说明任何“指向 NULL 的指针”。您引用的文字清楚明确地表明 空指针 已转换为false

    您发布的代码没有任何空指针,即它没有任何具有空指针值的指针。代码中的指针p 指向str.c_str() 缓冲区内的某个有效位置,这意味着p 本身不为空。因此,根据标准引用的段落,您的代码中没有任何内容可以转换为false

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2011-01-14
      • 2023-03-28
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多