C++什么是指针=新类型&Q;,而不是&Q;指针=新类型[]?

在许多教程中,关于动态内存的第一个代码样例是这样开始的:

int * pointer;
pointer = new int;        // version 1
//OR
pointer = new int [20];    // version 2

他们总是继续解释第二个版本的工作原理,但完全避免谈论第一个版本。

我想知道的是,pointer = new int创建了什么?我能用它来做什么?什么意思?每一篇教程都会完全避免谈论第一个版本。我发现(通过捣乱)是这样的:

#include <iostream>

using namespace std;

int main()
{
    int * pointer;
    pointer = new int;
   pointer[2] = 1932;   // pointer [2] exists? and i can  assign to it?!
   cout << pointer[2] << endl;      // ... and access it successfully?!
};

我可以下标pointer这一事实告诉我,到目前为止,pointer = new int隐式创建了一个数组。但如果是,那么它的尺寸是多少?

如果有人能帮我把这一切弄清楚,我将不胜感激...


解决方案

对于初学者来说,这是一个典型的C和C++错误。第一句话创建了一个仅容纳int的空间。第二个函数创建一个空间来容纳int中的20个。然而,在这两种情况下,它都将动态保留区域的开始地址分配给pointer变量。

更令人困惑的是,即使指针所指向的内存无效,您也可以使用索引访问指针(如pointer[2]所述)。在以下情况下:

int* pointer = new int;

您可以访问pointer[2],但您会有一个未定义的行为。请注意,您必须检查这些访问是否实际发生,并且编译器通常在防止此类错误方面几乎无能为力。

相关文章