nullptr用于终止C风格的字符串吗?

Con*_*one 4 c c++ pointers c-strings c++11

我对A Tour of 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; 
}
// The definition of count_x() assumes that the char* is a C-style string,
// that is, that the pointer points to a zero-terminated array of char.
Run Code Online (Sandbox Code Playgroud)

我知道如果p未被赋值,count_x应该终止,并且for循环应该在它到达p引用的C风格字符串的末尾时终止.

但是,当我构建一个使用count_x()的main函数时,它似乎永远不会正确终止:

int main () {

    char teststring[] = {'b', 'l', 'a', 'h', '\0'}; 
    cout << "teststring is: " << teststring << endl; 
    cout << "Number of b's is: " << count_x(teststring, 'b') << endl; 

    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

执行此操作会打印大量垃圾,然后以分段错误退出.如果我替换for (; p!=nullptr; ++p)count_xfor (; *p!='\0'; ++p),它正确地执行.我想这意味着字符串没有正确终止.如果是这样,我如何终止C风格的字符串,以便可以在这里使用nullptr?

编辑:评论中有一个讨论澄清了这种情况.我正在使用2013年9月出版的第一本书,上面的内容是错误打印的.本书第三版从2015年1月开始(在评论中链接)有更正的例子,for (; *p!=0; ++p)而不是使用for (; p!=nullptr; ++p).此修正也记录在本书的勘误表中.谢谢!

编辑2:对不起,伙计们,这显然已经在早些时候问过:"C++之旅"中的Buggy代码或不兼容的编译器?

Hea*_*utt 12

不,NULL指针不用于终止字符串.使用NUL字符.它们是不同的东西,但是如果你将它们中的任何一个分配给C中的整数,结果总是相同的:零(0).

NUL字符用C表示,'\0'并占用一个char存储空间.NULL指针在C中表示为0,并占用与其相同的存储空间void *.例如,在64位机器上,a void *是8个字节,'\0'而是一个字节.

也就是说,nullptr与它不是一回事'\0'.并且该字符是空字符,称为NUL,但它不应该被称为NULL字节或NULL字符.