这个程序有时崩溃,有时工作得很好。 声明一个变量数组,它的大小在程序中改变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
}
在这条线上:
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.resize(sz);