Программа иногда дает сбой, а иногда работает отлично. Объявляется массив переменных и его размер меняется в программе 2 раза - PullRequest
0 голосов
/ 06 августа 2020

Программа иногда дает сбой, а иногда работает отлично. Объявляется переменный массив, размер которого изменяется в программе 2 раза. Я использую визуальную студию. Он находится на c ++.

Это код на c ++:

int sz;                           //size of array
std::cin >> sz;                        //getting size
int* arr = new int[sz];           //declaring variable array.
for (int i = 0; i < sz; i++)
{
    arr[i] = i;                   //assigning values to all members of array
    std::cout << arr[i] << std::endl;       //printing the array
}
std::cin >> sz;                        //size changes again
for (int i = 0; i < sz; i++)
{
    arr[i] = i;                   //assigning new values
    std::cout << arr[i] << std::endl;       //printing the array
}

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Если вы хотите изменить размер arr, вы должны удалить старую и выделить новую

delete[] arr;
arr = new int [sz];
1 голос
/ 06 августа 2020

В этой строке:

std::cin >> sz;                        //size changes again

Комментарий не совсем правильный. Переменная, представляющая размер , изменилась, но массив arr не изменился. Таким образом, индексация в любую позицию, большую или равную старому размеру, вызовет неопределенное поведение. Это означает, что программа может работать иногда, а другие - нет.

Чтобы изменить размер массива arr, после указанной выше строки необходимо сделать:

delete [] arr;
arr = new int[sz];
0 голосов
/ 06 августа 2020

Если вы выделяете вектор новым, вы должны удалить его, когда он вам больше не нужен, и не использовать его произвольно, так что ваш код будет лучше, как:

int sz;                           //size of array
{
  std::cin >> sz;                        //getting size
  int* arr = new int[sz];           //declaring variable array.
  for (int i = 0; i < sz; i++)
  {
      arr[i] = i;                   //assigning values to all members of array
      std::cout << arr[i] << std::endl;       //printing the array
  }
  delete [] arr; // << Delete old one here, missing in original
}
{
  std::cin >> sz;                        //size changes again
  int* arr = new int[sz]; 
  for (int i = 0; i < sz; i++)
  {
      arr[i] = i;                   //assigning new values
      std::cout << arr[i] << std::endl;       //printing the array
  }
  delete [] arr; // <<--- Here as well, missing in original - less important, but leads to memory leak.
}

или просто используйте std::vector<int> arr(sz); и вы можете игнорировать удаление. Если вам абсолютно необходимо повторно использовать массив, используйте arr.resize(sz);

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