C++ 如何修复分段错误:c+中的11+;?

C++ 如何修复分段错误:c+中的11+;?,c++,templates,unix,visual-studio-code,g++,C++,Templates,Unix,Visual Studio Code,G++,我目前正在开发一个程序,该程序使用模板函数从数字数组中获取模式。在macOS上使用g++编译代码时不会出现问题(即没有错误、警告等)。但是,当我运行代码时,我在终端中得到以下输出: Segmentation fault: 11 以下是我的代码: #include <stdexcept> #include <cstdio> #include <cstddef> template<typename T> T mode(const T* values

我目前正在开发一个程序,该程序使用模板函数从数字数组中获取模式。在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);
}
我得到了那个错误(不是分段错误)

所以

是问题的原因,因为
sizeof(result)
int result
返回4,因此引发异常并且没有捕获程序。

我得到了该错误(不是分段错误)

所以


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

length<0
将永远不会为真,因为
length
是无符号类型。如果(sizeof(result)>1)应该检查什么?这总是正确的。在调试器中运行程序(例如,
gdb
),它会告诉您分段错误发生的位置。如果您不明白为什么会在该位置出现,请将此信息添加到您的问题中。您在此处使用的编译器版本是什么?代码将顺利编译—程序编译正常仅意味着程序没有语法错误。它与程序是否有逻辑错误无关。如果程序编译正常是程序正常运行的唯一要求,那么就不会有bug。你还想完成什么?e、 g.
int number=值[0]
不是T?数组的第一个位置应该有特殊的内容吗?
length<0
永远不会为真,因为
length
是无符号类型。如果(sizeof(result)>1)应该检查什么?这总是正确的。在调试器中运行程序(例如,
gdb
),它会告诉您分段错误发生的位置。如果您不明白为什么会在该位置出现,请将此信息添加到您的问题中。您在此处使用的编译器版本是什么?代码将顺利编译—程序编译正常仅意味着程序没有语法错误。它与程序是否有逻辑错误无关。如果程序编译正常是程序正常运行的唯一要求,那么就不会有bug。你还想完成什么?e、 g.
int number=值[0]
不是T?数组的第一个位置应该有什么特殊的东西吗?这不应该导致分段错误。@walnut似乎有不同的编译器,然后在任何情况下OP都声称观察到分段错误,而不是调用终止/中止。我问了一个问题来澄清这一点,但正如我在之前(现已删除)的评论中提到的,抛出
range\u错误
异常本身不应导致分段错误或您看到的特定终止消息。问题是OP正在向异常的构造函数传递一个空指针常量,这很可能导致未定义的行为。我刚刚将您的编辑添加到我的代码中,它就遇到了分段错误。但是,我现在得到的是“Mode=0”而不是“Mode=1”。这不应该导致分段错误。@walnut似乎有不同的编译器,然后在任何情况下OP都声称观察到分段错误,而不是终止/中止调用。我问了一个问题来澄清它,但正如我在以前(现已删除)的评论中提到的,抛出
range\u错误
异常本身不应导致分段错误或您看到的特定终止消息。问题是OP正在向异常的构造函数传递一个空指针常量,这很可能导致未定义的行为。我刚刚将您的编辑添加到我的代码中,它就遇到了分段错误。然而,我现在得到的是“Mode=0”,而不是“Mode=1”。
"Mode = 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;
    }
 }