Глобальный вектор, вызывающий segfault в конце программы c ++ - PullRequest
2 голосов
/ 19 июня 2020

Эта программа распечатывает "пока" в самом конце и затем перестает работать. Понятия не имею почему. Думаю, это может быть связано с глобальным вектором? Я поигрался с ним и обнаружил, что если я уберу cout << i, j и cout << endl, он будет segfault, ничего не печатая. n, p, k и T не очень большие, не больше 30. </p>

    int n, p, k;
    vector<vector<int>> plates;

    int main() {
      int T;
      cin >> T;
      for (int t = 1; t != 1 + T; ++t) {
        cin >> n >> k >> p;
        plates.resize(n + 1, vector<int>(k + 1, 0));
        for (int i = 1; i <= n; ++i) {
          for (int j = 1; j <= k; ++j) {
            cin >> plates[i][j];
            cout << i << "," << j << "\t";
          }
          cout << endl;
        }
      }
      cout << "bye" << endl;
    }

1 Ответ

1 голос
/ 19 июня 2020
plates.resize(n + 1, vector<int>(k + 1, 0));

resize() не делает то, что вы думаете. resize() здесь не устанавливает каждое значение в векторе с измененным размером на второй параметр. Только новые значения в векторе, если он растет, устанавливаются на это значение.

Итак, если в первый раз через внешний l oop vector был 2 строки на 2 столбца, и во второй раз через внешний l oop размеры указаны как 50x50, это добавит еще 48 значений к plates, каждое из которых является вектором с 50 значениями.

Но первые два значения в plates векторе остаются неизменными, с их исходным двузначным вектором в них.

Решение кажется очевидным: добавьте plates.clear() перед этим resize().

...