没有指针的C++中的动态内存分配 - 指针的重点是什么?

ste*_*ess 0 c++ memory arrays pointers dynamic

考虑以下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;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码的作用就是: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): 
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 8

    size *=2;
    int p_values[size];
}
Run Code Online (Sandbox Code Playgroud)

不.这不会增加p_values在函数开头声明的现有数组的大小.这p_values在内部范围内声明了一个名为的不同数组......

......并且因为内部范围立即在此结束,所以这没有任何效果.循环继续并从原始p_values数组的末尾运行,导致未定义的行为和内存损坏.

然而,程序在运行时动态地增加了数组的大小.

不,它没有.现有阵列的大小未动态增加.在内部范围中声明了一个不同的,更大的可变长度数组,并立即销毁.原始数组保持原始大小,并导致未定义的行为.

只是继续在数组中输入更多的值,并且在某些时候你最终会破坏堆栈上的返回地址,导致main()返回时出现段错误(假设你的编译器通过调整当前函数的大小来动态地实现可变长度数组)堆栈框架).