以下代码在编译和运行时会出现分段错误。我正在 MacBook 上尝试《C++ 之旅》第 12 页上的示例。
编译命令-
clang++ -Wall -std=c++11 -o replacement.o replacement.cpp && ./replacement.o
错误消息 - 'zsh:分段错误./replacement.o'
完整代码-
#include <iostream>
int count_occurances(char* p, char x)
{
int count = 0;
// count number of times x occurs in p
while (p != nullptr)
{
if (*p == x)
++count;
++p;
}
return count;
}
int main(int argc, const char * argv[]) {
// insert code here...
char num_array[4] = {'a', 'b', 'b', 'c'};
std::cout << "Running count occurances array" << count_occurances(num_array, 'b') << "done\n" ;
return 0;
}
本质上是尝试通过增加指针来迭代数组,但不知何故弄乱了 nullptr 检查,结果它访问了不应该访问的内存。
这是因为
p != nullptr
始终为真,因为 p = &num_array
是有效地址。nullptr
比较应该位于函数的开头,作为一般的健全性检查。
继续
++p
超出sizeof(num_array) = 4
,这是一种未定义的行为。在您的系统中,它会因分段错误而崩溃。
您可以将
sizeof(num_array)
作为函数参数传递,或者指定 0
(NUL) 字符作为结尾:
char num_array[] = {'a', 'b', 'b', 'c', 0};
然后在循环内您可以检查
*p != 0
。