c ++什么是"pointer = new type"而不是"pointer = new type []"?

cod*_*gan 16 c++ arrays new-operator dynamic-memory-allocation

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

int * pointer;
pointer = new int;        // version 1
//OR
pointer = new int [20];    // version 2
Run Code Online (Sandbox Code Playgroud)

他们总是着手解释第二个版本是如何工作的,但完全避免谈论第一个版本.

我想知道的是,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?!
};
Run Code Online (Sandbox Code Playgroud)

我可以下标的事实pointer告诉我到目前为止pointer = new int隐含地创建了一个数组.但如果是这样,那么它的大小是多少?

如果有人能帮我解决这一切,我将不胜感激......

Die*_*lla 13

对于初学者来说,这是C和C++中的典型错误.第一句话,创造了一个只持有一个空间int.第二个创造了一个空间来容纳其中的20个int.但是,在这两种情况下,它都会将动态保留区域的起始地址分配给pointer变量.

为了增加混淆,pointer[2]即使他们指向的内存无效,您也可以访问带索引的指针(如您所说).如果是:

int* pointer = new int;
Run Code Online (Sandbox Code Playgroud)

你可以访问pointer[2],但你有一个未定义的行为.请注意,必须检查这些访问是否实际发生,并且编译器通常可以很少地防止此类错误.


Def*_*ult 12

我老师这样解释了.
想想电影.实际的座位是内存分配,你得到的票是指针.

int * pointer = new int;
Run Code Online (Sandbox Code Playgroud)

这将是一个有一个座位的电影院,指针将成为该座位的入场券

pointer = new int [20] 
Run Code Online (Sandbox Code Playgroud)

这将是一个有20个座位的电影院,指针将是第一个座位的门票.指针[1]将是第二个座位的票证,而指针[19]将是最后一个座位的票证.

当你做int* pointer = new int;,然后访问pointer[2]你让某人坐在过道,意味着未定义的行为

  • 我从来没有听过那种类比.我喜欢它,特别是"坐在过道里"是不确定的行为. (4认同)

Ric*_*o M 9

这只创建一个整数.

pointer = new int;        // version 1
Run Code Online (Sandbox Code Playgroud)

这创建了20个整数.

pointer = new int [20]    // version 2
Run Code Online (Sandbox Code Playgroud)

以下是无效的,因为指针[2]转换为*(指针+ 2); 尚未创建/分配.

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 succesfuly?!
};
Run Code Online (Sandbox Code Playgroud)

干杯!