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_x用for (; *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字符.