Как исправить ошибку сегментации, когда нет указателей? - PullRequest
0 голосов
/ 21 сентября 2019

Когда я компилирую свой код, он работает, компилируется без ошибок, однако, когда я запускаю код, он выдает следующую ошибку «Ошибка сегментации» без дополнительной информации.Однако, когда я посмотрел «Ошибка сегментации», это обычно связано с указателями, и я вообще не использовал указатели.

Я уже просмотрел все это на предмет опечаток, в которых я мог бы сказать:& 'вместо' && 'и так далее.Я также рассмотрел ошибку и перекомпилировал код.

#include <iostream>
#include <vector>

std::string answer(int placement, std::vector<int> peopleInLinE, int Fifties, int twentyFives)
{
  if (((peopleInLinE[placement] - 25) % (Fifties * 50)) == 0)
  {
    Fifties -= peopleInLinE[placement] / (Fifties * 50);
  } else if (((peopleInLinE[placement] - 25) % (twentyFives * 25)) == 0)
  {
    twentyFives -= peopleInLinE[placement] / (twentyFives * 25);
  } else if (peopleInLinE[placement] == 100)
  {
    if (Fifties >= 1 && twentyFives >= 1)
    {
      Fifties -= 1;
      twentyFives -= 1;
    } else if (twentyFives >= 3)
    {
      twentyFives -= 3;
    } else {
      return "NO";
    }
  } else {
    return "NO";
  }
  return "YES";
}

std::string tickets(const std::vector<int> peopleInLine){
  int twentyFiveS;
  int FiftieS;

  for (int placemenT; peopleInLine.size(); placemenT++)
  {
    if (answer(placemenT, peopleInLine, FiftieS, twentyFiveS) == "NO") {
      return "NO";
    }
  }
  return "YES";
}
int main() {
  std::cout << tickets({25, 50, 100, 25});
  return 0;
}

Причина, по которой некоторые переменные имеют случайные заглавные буквы, заключается в том, что я не знал, говорилось ли это, что две вещи имеютточно такое же написание, так что это одно и то же, поэтому я изменил написание, чтобы попытаться выяснить это.

Этот код предназначен для задачи "Вася - Клерк" на Codewars, я включил весь файл,потому что я понятия не имею, где может быть ошибка.

Единственное сообщение об ошибке, которое я получил, это «Ошибка сегментации» без других объяснений.

Ответы [ 2 ]

4 голосов
/ 21 сентября 2019
int twentyFiveS;
int FiftieS;

Эти переменные имеют неопределенные значения, поскольку вы их не инициализировали.Чтение неопределенного значения имеет неопределенное поведение.

if (answer(placemenT, peopleInLine, FiftieS, twentyFiveS) == "NO") {

в этой строке вы передаете копии неопределенных значений в функцию.Поведение программы не определено.

 for (int placemenT; peopleInLine.size(); placemenT++)

В этой строке вы увеличиваете неопределенное значение, что также является неопределенным поведением.Кроме того, условие завершения цикла неверно, потому что размер peopleInLine никогда не изменяется в программе и, следовательно, не может достигать нуля.

Итак, вы говорите, что мне нужно добавить определенное значениепеременным (т. е. int fiftyFiveS = 0; int FiftieS = 0;?

. Вы должны инициализировать их некоторым значением, если хотите использовать их значение. Если вы хотите, чтобы это значение было 0, тоинициализируйте это.

placemenT должно быть по крайней мере инициализировано значением, которое является допустимым индексом в peopleInLinE, иначе поведение по-прежнему будет неопределенным. Вы также должны убедиться, что цикл завершается до доступавектор вне границ.

1 голос
/ 21 сентября 2019

Адрес Santizier - ваш друг.

$ g++ -ggdb3 -O0 so.cpp -fsanitize=address
$ ./a.out
AddressSanitizer:DEADLYSIGNAL
=================================================================
==8680==ERROR: AddressSanitizer: SEGV on unknown address 0x60200002002c (pc 0x555f1b4fd438 bp 0x7fffe57487f0 sp 0x7fffe57486d0 T0)
==8680==The signal is caused by a READ memory access.
    #0 0x555f1b4fd437 in answer[abi:cxx11](int, std::vector<int, std::allocator<int> >, int, int) /tmp/so.cpp:6
    #1 0x555f1b4fd9cc in tickets[abi:cxx11](std::vector<int, std::allocator<int> >) /tmp/so.cpp:36
    #2 0x555f1b4fdd83 in main /tmp/so.cpp:43
    #3 0x7f9c60e6beda in __libc_start_main (/lib64/libc.so.6+0x23eda)
    #4 0x555f1b4fd249 in _start (/tmp/a.out+0x2249)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /tmp/so.cpp:6 in answer[abi:cxx11](int, std::vector<int, std::allocator<int> >, int, int)
==8680==ABORTING

Проблема в том, что вы используете неинициализированную переменную (placemenT) в качестве индекса для peopleInLine.

...