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]
你让某人坐在过道,意味着未定义的行为
这只创建一个整数.
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)
干杯!