如何正确使用nullptr?

问题描述 投票:11回答:2

目前我正在阅读Byarne Stroustrup的“C ++之旅”。重要的是:关于“指针,数组和引用”,他给出了一个关于如下使用nullptr的例子:

int count_x(char* p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to nothing)
{

    if (p == nullptr) return 0;
        int count = 0;

    for (; p != nullptr; ++p)
        if (*p == x)
            ++count;

    return count;
}

在我的主要内容中:

int main(){

    char* str = "Good morning!";
    char c = 'o';
    std::cout << count_x(str, c) << std::endl;

    return 0;
}

当我运行程序它崩溃时,我得到一个异常抛出的行

if (*p == x)

如果我将循环更改为:

for (; *p; p++)
    if (*p == x)
        ++count;

现在一切正常!我正在使用MSVC ++ 14.0。

  • 我在ideone上运行的相同代码我没有得到例外,但结果总是0应该是3

https://ideone.com/X9BeVx

c++ nullptr
2个回答
14
投票

p != nullptr*p执行非常不同的检查。

前者检查指针本身是否包含非空地址。虽然后者检查指向的地址是否包含非0的内容。一个在循环中显然是合适的,其中缓冲区的内容被检查,而另一个则不是。

你是段错误的,因为你永远不会停止读取缓冲区(有效指针在递增时不太可能产生null)。因此,您最终会访问超出缓冲区限制的方式。


0
投票

请记住,您正在使用C语言功能。

你的问题出在你的for循环中。指针到达字符数组的最后一个元素后,它指向数组的末尾而不是nullptr

想象一下,你有一个字符数组,如const char *a ="world"ptr指向

     +-----+     +---+---+---+---+---+---+
ptr :| *======>  | w | o | r | l | d |\0 |
     +-----+     +---+---+---+---+---+---+  

ptr指向的最后一个元素是'\0',在你的for中你应该改变你的代码如下:


for (; *p != 0; p++) {
        if (*p == x)
            ++count;
    }

输出:3

© www.soinside.com 2019 - 2024. All rights reserved.