请问c++里面,int *p=new int(2)是为p指针申请一个堆区大小为4的指针域,并赋值2;

int *p=new int[2]()是开辟一个8字节两个int型数据,并都初始化为0,p指向第一个数据地址;请问我的这些解释有错吗?如果没有,请问为什么对于这两种情况,delete p都可以,数组的不是应该要delete[] p吗?还有最严重的一个问题:int *p=new int;的意思应该是申请一个不指定大小的整形空间,我也用delete p,运行vs2010一般可以得到正确答案,但是结束时候就会弹出报错提示什么触发一个断点是什么意思?跪求答案

int * p = new int[2];

语句格式为上面形式,最后不需要一对小括号。
意思是从系统堆中分配两个int型的空间,为连续8字节空间(在win32系统中int为32位,4字节),并由指针p指向已分配空间的起始地址(即第一个数组元素的地址)。分配后新内存中的值一般并不会自动初始化为0,而应该由程序员进行初始化(可用memset或ZeroMemory函数,也可采用循环语句实现)。
在释放由new 关键字分配的数组空间时,一般要用带[]的 delete语句格式(此例中即为: delete[] p;),不带[]的格式用于释放由new 分配的单个变量内存空间,用未带[]的delete释放此例中的p从语法上来看并未出错,编译时不会报错,实际可能只释放了数组的第一个元素,这也可能是你在VS2010中运行结束时弹出错提示的原因。

由于C/C++语法灵活多变,再者内存的申请与释放以及指针的管理是C/C++中最易出错和较难理解的部分,建议仔细阅读C/C++中内存分配与释放相关的说明,严格按正确的语法书写代码。追问

嗯,受教了,但是int *p=new int[2]();是可行的,这样就为p数组全部初始化为0了,应该是调用int的默认构造函数。。。吧,猜的。还有是为什么不能解引用p,就算p赋了值,&p也不能得到正确的值

追答

1. 但是int *p=new int[2]();

C++中对基本类型当作对象来处理,可以有构造函数,传统C中没有。

2.还有是为什么不能解引用p,就算p赋了值,&p也不能得到正确的值

p是指针,你用 & 运算符是取地址,相当于取得指针p的存放地址,而不是取指针p存放的值,当然得不到正确的值。

*p 为取指针p存放的值。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-28
int *p=new int(2);
这里的 int(2) 是调用构建函数,参数值是2。
意思是 声明 p 是 整型指针,动态分配 sizeof(int) 字节存储区给它,初始化为 2。
于是,语句里可以用 *p, p[0], delete []p;
-------
int *p=new int[2](2);
语法错,不可以对数组作初始化。
只可以 int *p=new int[2];
-------
“int *p=new int;的意思应该是申请一个不指定大小的整形空间,”
不是的。意思应当是 声明 p 是 整型指针,动态分配 sizeof(int) 字节存储区给它。追问

嗯,3Q,关键的问题是我这样写语句:int *p=new int;主要是为了在输入的时候可以把值存在p[i]数组里,循环cin>>p[i],结尾也有delete[] p;关闭运行结果时会却会弹出报错框,但是运行的结果是对的?按道理p应该会随着输入次数的增加而依次开辟内存吧,最后的delete[] p是只delete一个数据指针吗难道(改成delete p也一样)。

追答

int *p=new int;
你将有1个元素的数组。语句中可以用到 p[0]。没有 p[1],p[2],....
语句中可以用到 delete []p.
声明中 *p 是指针,
语句中,*p 是值,等同 p[0].
语句中,p 是地址。

追问

嗯,没错,但是会随着输入元素的个数增加而有p[1],p[2]...吧,否则最后不可能输出1 3 6这个答案啊

追答

p[1],p[2]... 实际上是一种地址计算。能输出1 3 6,是因为程序小,简单,让你用了这几个尚未派别的用途的地址,是不可靠的,没有分配给你。

本回答被提问者采纳