nullptr 是否用于终止 C 风格的字符串?
Is nullptr used to terminate C-style strings?
我对 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.
我理解 count_x 应该在 p 未分配时终止,并且 for 循环应该在到达 p 引用的 C 风格字符串的末尾时终止。
然而,当我构建一个使用 count_x() 的主函数时,它似乎永远不会正确终止:
int main () {
char teststring[] = {'b', 'l', 'a', 'h', '[=11=]'};
cout << "teststring is: " << teststring << endl;
cout << "Number of b's is: " << count_x(teststring, 'b') << endl;
return 0;
}
执行此操作会打印出大量垃圾,然后以分段错误退出。如果我将 count_x
中的 for (; p!=nullptr; ++p)
替换为 for (; *p!='[=14=]'; ++p)
,它会正确执行。我想这意味着字符串没有正确终止。如果是这样,我如何终止 C 风格的字符串以便可以在此处使用 nullptr?
编辑:评论中的讨论澄清了这种情况。我使用的是 2013 年 9 月出版的该书的第一版,上面的内容打印有误。该书 2015 年 1 月的第三版(在评论中有链接)有更正的示例,它使用 for (; *p!=0; ++p)
而不是 for (; p!=nullptr; ++p)
。此更正也记录在本书的勘误表中。谢谢!
Edit2:对不起,伙计们,这显然已经在之前的 SO 上被问过:Buggy code in "A Tour of C++" or non-compliant compiler?
不,NULL 指针不用于终止字符串。使用 NUL 字符。它们是不同的东西,但是如果您将它们中的任何一个赋值给 C 中的整数,结果总是相同的:零 (0).
NUL 字符在 C 中表示为 '[=10=]'
并占用一个 char
的存储空间。 NULL 指针在 C 中表示为 0,占用与 void *
相同的存储空间。例如,在 64 位机器上,void *
是 8 个字节,而 '[=10=]'
是一个字节。
即,nullptr 与 '[=10=]'
不同。并且该字符是空字符,称为NUL,但不应该称为NULL字节或NULL字符。
我对 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.
我理解 count_x 应该在 p 未分配时终止,并且 for 循环应该在到达 p 引用的 C 风格字符串的末尾时终止。
然而,当我构建一个使用 count_x() 的主函数时,它似乎永远不会正确终止:
int main () {
char teststring[] = {'b', 'l', 'a', 'h', '[=11=]'};
cout << "teststring is: " << teststring << endl;
cout << "Number of b's is: " << count_x(teststring, 'b') << endl;
return 0;
}
执行此操作会打印出大量垃圾,然后以分段错误退出。如果我将 count_x
中的 for (; p!=nullptr; ++p)
替换为 for (; *p!='[=14=]'; ++p)
,它会正确执行。我想这意味着字符串没有正确终止。如果是这样,我如何终止 C 风格的字符串以便可以在此处使用 nullptr?
编辑:评论中的讨论澄清了这种情况。我使用的是 2013 年 9 月出版的该书的第一版,上面的内容打印有误。该书 2015 年 1 月的第三版(在评论中有链接)有更正的示例,它使用 for (; *p!=0; ++p)
而不是 for (; p!=nullptr; ++p)
。此更正也记录在本书的勘误表中。谢谢!
Edit2:对不起,伙计们,这显然已经在之前的 SO 上被问过:Buggy code in "A Tour of C++" or non-compliant compiler?
不,NULL 指针不用于终止字符串。使用 NUL 字符。它们是不同的东西,但是如果您将它们中的任何一个赋值给 C 中的整数,结果总是相同的:零 (0).
NUL 字符在 C 中表示为 '[=10=]'
并占用一个 char
的存储空间。 NULL 指针在 C 中表示为 0,占用与 void *
相同的存储空间。例如,在 64 位机器上,void *
是 8 个字节,而 '[=10=]'
是一个字节。
即,nullptr 与 '[=10=]'
不同。并且该字符是空字符,称为NUL,但不应该称为NULL字节或NULL字符。