增加 ptr 以迭代数组时,nullptr 检查出现分段错误

问题描述 投票:0回答:1

以下代码在编译和运行时会出现分段错误。我正在 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 检查,结果它访问了不应该访问的内存。

macos c++11 segmentation-fault nullptr
1个回答
0
投票

这是因为

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

© www.soinside.com 2019 - 2024. All rights reserved.