【问题标题】:How to fix a segmentation fault: 11 in c++?如何修复分段错误:C++ 中的 11?
【发布时间】:2020-03-30 04:12:48
【问题描述】:

我目前正在开发一个程序,该程序使用模板函数从数字数组中获取模式。该代码将在我的 macOS 上使用 g++ 毫无问题地编译(即没有错误、警告等)。但是,当我运行代码时,我会在终端中得到以下输出:

Segmentation fault: 11

这是我的代码:

#include <stdexcept>
#include <cstdio>
#include <cstddef>

template<typename T>
T mode(const T* values, size_t length) {
    if (length < 0) throw std::out_of_range{ 0 };
    T result{};
    int number = values[0];
    int count = 1; 
    int countMode = 1;

    for (int i = 1; i < length; i++) {
        if (values[i] == number) {
            countMode++;
        }
        else {
            if (count > countMode) {
                countMode = count;
                result = number;
            }
            count = 1;
            number = values[i];
         }
    }

    if (sizeof(result) > 1) throw std::range_error{ 0 };
    else {
        return result;
    }
 }

int main() {
   const int arr[] = { 1, 4, 1, 2, 7, 1, 2, 5, 3, 6 };
   int arr_size = sizeof(arr) / sizeof(arr[0]);
   const auto result = mode<int>(arr, arr_size);
   printf("Mode = %d\n", result);
}

我得到了我的部分代码here

预期的输出是这样的:

"Mode = 1"

【问题讨论】:

  • length &lt; 0 永远不会为真,因为length 是无符号类型。 if (sizeof(result) &gt; 1) 应该检查什么?这将永远是正确的。
  • 在调试器中运行您的程序(例如gdb),它会告诉您发生分段错误的位置。如果您不明白为什么会在那个地方发生,请将此信息添加到您的问题中。
  • 你这里使用的编译器是什么版本的?
  • 代码编译不会有问题 -- 程序编译成功只意味着程序没有语法错误。它与程序是否有逻辑错误无关。如果程序编译正常是程序正常工作的唯一要求,那么就不会有错误这样的事情。还有how to debug small programs
  • 你想完成什么?例如int number = values[0] 不是 T 吗?数组的第一个位置应该有什么特别的东西吗?

标签: c++ templates unix visual-studio-code g++


【解决方案1】:

我收到了那个错误(不是分段错误)

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct null not valid

所以

 if (sizeof(result) > 1) throw std::range_error{ 0 };
    else {
        return result;
    }
 }

是导致问题的原因,因为sizeof(result)int result 返回 4,因此抛出异常并且没有捕获器。

【讨论】:

  • 这不会导致分段错误。
  • @walnut 看来我们有不同的编译器,那么
  • 在任何情况下,OP 声称观察到分段错误,而不是调用终止/中止。
  • 我已经问了一个问题here 来澄清它,但正如我在之前(现已删除)的评论中提到的,抛出range_error 异常本身不应导致分段错误或特定终止你看到的消息。问题是 OP 将一个空指针常量传递给异常的构造函数,这很可能导致未定义的行为。
  • 我刚刚将您的编辑添加到我的代码中,它解决了分段错误。但是,我现在得到的是“Mode = 0”而不是“Mode = 1”。
猜你喜欢
  • 2020-12-13
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2021-07-18
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多