Как исправить ошибку сегментации: 11 в c ++? - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время я работаю над программой, которая использует режим из массива чисел, используя функцию шаблона. Код будет компилироваться без проблем с использованием g ++ на моей macOS (т.е. без ошибок, предупреждений и т. Д. c.). Однако когда я запускаю код, я получаю этот вывод в терминале:

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);
}

Я получил часть своего кода здесь

Ожидаемый результат такой:

"Mode = 1"

1 Ответ

2 голосов
/ 30 марта 2020

Я получил эту ошибку (не ошибка сегментации)

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) возвращает 4 для int result, следовательно, выдается исключение, и нет ловца.

...