目前我正在阅读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
:答案 0 :(得分:14)
p != nullptr
和*p
执行非常不同的检查。
前者检查指针本身是否包含非空地址。而后者检查指向的地址是否包含非0的内容。一个在循环中显然是合适的,其中缓冲区的内容被检查,而另一个则不是。
你是段错误,因为你从不停止读取缓冲区(有效指针在递增时不太可能产生null)。所以你最终访问超出缓冲区限制的方式。
答案 1 :(得分: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