【发布时间】:2017-04-03 13:18:59
【问题描述】:
考虑以下 C++ 程序:
#include <iostream>
using namespace std;
void printArray(int p_values[], int size, int elements_set);
int main()
{
int next_element = 0;
int size = 3;
int p_values[size];
int val;
cout << "Please enter a number: ";
cin >> val;
while (val > 0)
{
if (size == next_element+1)
{
size *=2;
int p_values[size];
}
p_values[next_element] = val;
next_element++;
cout << "Current array values are: " << endl;
printArray(p_values, size, next_element);
cout << "Please enter a number (or 0 to exit): ";
cin >> val;
}
}
void printArray(int p_values[], int size, int elements_set)
{
cout << "Total size of array: " << size << endl;
cout << "Number of slots set so far: " << elements_set << endl;
cout << "Values in the array: " << endl;
for (int i = 0; i < elements_set; ++i){
cout << "p_values[" << i << "] = "
<< p_values[i] << endl;
}
}
代码的作用很简单: 1. 要求用户输入号码 2.数字保存在数组中 3.打印出当前数组的内容
一旦数组满了,它的大小就会加倍。 这种在运行时动态增加数组通常是用指针来完成的。 事实上,有人告诉我,只有使用指针才能动态增加数组大小。
但是,正如您在上面的程序中看到的那样,我没有使用任何指针,而只使用了一个静态数组。然而,程序会在运行时动态增加数组的大小。
因此,我的问题是: 1. 为什么我在大学(以及几本书中)被告知,在 C++ 程序中,在运行时增加内存使用量只能通过使用指针来实现? 2. 考虑到动态内存分配可以在没有指针的情况下完成,指针的意义是什么(除了可以在调用函数时通过引用传递变量)?
程序运行一段时间后,输入8个数字后,程序输出如下:
Please enter a number (or 0 to exit): 8
Current array values are:
Total size of array: 12
Number of slots set so far: 8
Values in the array:
p_values[0] = 1
p_values[1] = 2
p_values[2] = 3
p_values[3] = 4
p_values[4] = 5
p_values[5] = 6
p_values[6] = 7
p_values[7] = 8
Please enter a number (or 0 to exit):
【问题讨论】:
-
公平地说,这不是一个 C++ 程序。 VLA 不是 C++ 的一部分。
-
指针用于指向事物。如何分配东西是另一回事。
-
什么是 VLA,如果我可以问的话?
-
它也不考虑范围。大括号内的
p_values与 main 顶部的p_values不同,并且在其原始边界之外访问它是未定义的行为。简短的回答是“你没有这样做。” -
您不仅在使用 VLA,而且根本没有增加原始数组维度。您使用 VLA 定义了一个新的本地数组。您只是在通过旧数组的边界写入堆栈。无论哪种情况,迟早都会发生堆栈溢出
标签: c++ arrays pointers memory dynamic