Пожалуйста, объясните ошибку сегментации в этом конкретном коде

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

Я новичок в кодировании, и поэтому, естественно, я часто сталкиваюсь с ошибками кодирования. Я постоянно сталкиваюсь с ошибками ошибки сегментации, и мне было интересно, может ли кто-нибудь объяснить, что это такое, что не так с приведенным ниже кодом и как избежать ошибок сегментации в будущем. Заранее спасибо.

 #include <iostream>
#include <algorithm>
#include <vector>

int main() {
  std::vector<std::vector<int> > pointers;
  std::vector<int> squawkers;
  int n, m, s, t, counter = 0;
  std::cin >> n >> m >> s >> t;
  squawkers[s] = 1;
  for (int i = 0; i < m; i  ) {
    int a, b;
    std::cin >> a >> b;
    pointers[a].push_back(b);
    pointers[b].push_back(a);
  }
  while (counter < t) {
    t  ;
    std::vector<int> temp (n);
    std::fill(temp.begin(), temp.begin() n-1, 0);
    for (int i = 0; i < n; i  ) {
      if (pointers[i].size() != 0) {
        for (int j = 0; j < pointers.size(); j  )
          temp[j]  = squawkers[i];
      }
    }
    squawkers = temp;
  }
  int sum;
  for (int i = 0; i < squawkers.size(); i  )
    sum  = squawkers[i];
  std::cout << sum << std::endl;
}
  

Комментарии:

1. Вы использовали свой отладчик?

2. Ваши векторы squawkers и pointers пусты, и вы пытаетесь получить доступ к элементам, которые не существуют. Точно так же, как в вашем последнем вопросе SO…

3. Каковы ваши намерения с этой строкой squawkers[s] = 1; ?

4. squarkers имеет нулевой размер (т. Е. squarkers.size() возвращает ноль), поэтому первая строка squarkers[s] = 1 имеет неопределенное поведение. Чтобы squarkers[s] = 1 быть четко определенным, тест s >= 0 amp;amp; s < squarkers.size() должен быть истинным ПЕРЕД его выполнением (после слишком поздно). Чтобы это было правдой, squarkers необходимо изменить размер до значения, большего s (например, путем явного изменения размера или добавления достаточного количества элементов). Ничего из этого не произойдет, если ВЫ явно не заставите это произойти.

5. Извините за это, ребята. В будущем я постараюсь быть более экономным в вопросах. Спасибо за поддержку.

Ответ №1:

Этот короткий код, извлеченный из вашего кода выше, содержит ошибку.

 int main() {
  std::vector<int> squawkers;
  std::cin >> s;
  squawkers[s] = 1;
}
  

Не имеет значения, какое значение s имеет, squawkers имеет нулевой размер, и поэтому любое использование [] для него является ошибкой.

Для новичка остальная часть вашего кода довольно продвинута. Поэтому мне странно, что существует эта простая ошибка.

Комментарии:

1. В первом for цикле возникает та же проблема. Они вызывают push_back несуществующие элементы pointers .