提问者:小点点

这个程序有时崩溃,有时工作得很好。 声明了一个变量数组,它的大小在程序中改变了2次


这个程序有时崩溃,有时工作得很好。 声明一个变量数组,它的大小在程序中改变2次。 我正在使用visual Studio。 它是用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个答案

匿名用户

在这条线上:

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

这个评论并不是真的正确。 更改了表示大小的变量,但不更改数组arr。 因此索引到任何大于或等于旧大小的位置都将调用未定义的行为。 这意味着程序有时可能工作,而不是其他。

要调整arr数组的大小,在上面一行之后,您需要执行以下操作:

delete [] arr;
arr = new int[sz];

匿名用户

如果要调整arr的大小,则必须删除旧arr并分配新arr

delete[] arr;
arr = new int [sz];

匿名用户

如果您分配了一个带有new的向量,您应该在不再需要它之后删除它,并且不要任意重用它,这样您的代码会更好:

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.
}
{
  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.
}

或者只使用std::vector; arr(sz);,您可以忽略删除。 如果绝对需要重用数组,请使用arr.resize(sz);