Почему я не могу назначить 1 элемент динамической вкладке размера 2>? - PullRequest
0 голосов
/ 01 ноября 2018

Упрощенная версия моего кода выглядит так:

int * tab = nullptr;
int index = 0;
int size = 1;   // Program works unless this is init'd to something higher!
int a = 0;

while (true)
{
    int input;
    std::cin >> input;

    if (input == 0) break;
    index++;

    if (index >= size) {
        size = size * 2;
        int * newt = new int[size];

        for (int i = 0; i < a; ++i)
            newt[i] = tab[i];

        delete[] tab;
        tab = newt;
    }
    tab[a] = input;
    a++;
}

Всякий раз, когда я пытаюсь изменить целочисленное значение size на значение больше 1, программа завершает работу. Visual Studio кричит о проблеме доступности памяти, но все же я не могу понять, что именно не так. Мне не нужно менять его, но я боролся с этим кодом более часа, пока случайно не изменил значение переменной на 1, и затем оно заработало. Мне просто любопытно, почему.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

В дополнение к Гонки Легкости на орбите :

Вот мой подход к пересмотренной версии:

#include <iomanip>
#include <iostream>
#include <sstream>

int main()
{
  int *tab = nullptr;
  int len = 0, size = 0;
  std::stringstream in;
  in << "1 2 3 4 5 6 7 8 9 10 0";
  while (true)
  {
    int input;
    //std::cin >> input;
    in >> input;
    if (input == 0) break;
    if (len >= size) {
      size = std::max(2 * size, 1);
      int * newt = new int[size];
      for (int i = 0; i < len; ++i) newt[i] = tab[i];
      delete[] tab;
      tab = newt;
    }
    tab[len++] = input;
  }
  for (int i = 0; i < len; ++i) std::cout << ' ' << tab[i];
  std::cout << '\n';
  return 0;
}

Выход:

 1 2 3 4 5 6 7 8 9 10

Демонстрация в реальном времени на coliru

Я должен признать, что до сих пор не понял, почему оригинальная версия должна быть сломана. Вот моя попытка на coliru , которая, кажется, работает нормально (хотя я знаю - работа в порядке не означает, что нет UB ). Понял.

0 голосов
/ 01 ноября 2018

Если size больше единицы, то index >= size не будет иметь значение true на первой итерации, ни один из кодов, в результате которых tab указывает на что-либо, не выполняется, поэтому доступ tab[a] нарушен .

Твоему алгоритму довольно сложно следовать, поэтому я не предлагаю конкретное решение, а только предлагаю изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...