问个菜鸟问题
代码如下:
#include <iostream>
using namespace std;
void main()
{
unsigned int *a,*b;
struct dt{unsigned int mm,dd,yy;};
a = new unsigned int(20);
//用a指向一个一个机器字长的地址单元并赋初值,20;
//等效于a = new unsigned int;
//*a = 20;
b =new unsigned int[20];
for (int i = 0;i <20;i++)
{
*b=i;
cout < < "b[i] is : " < <*b++ < <endl;
}
cout < < *a < <endl;
dt *c=new dt;
//使c指向一个struct dt数据结构对象的首地址并且给初值1994.8.15
c-> yy=1994;
c-> mm=8;
c-> dd=15;
//cout < <a < <b < <c < <endl;
cout < <a < < "\t " < <b < < "\t " < <c < < "\t " < <endl;
cout < <c-> yy < < ". " < <c-> mm < < ". " < <c-> dd < < ". " < <endl;
delete a;
//delete []b;
a = new unsigned int[300];
dt *d = new dt ;
*d = *c;
cout < <c-> yy < < ". " < <c-> mm < < ". " < <c-> dd < < ". " < <endl;
cout < <a < < "\t " < <b < < "\t " < <c < < "\t " < <d < < "\t " < <endl < <endl ;
int test ;
cin> > test;
}
编译器是.net2005,为什么总是在delete []b,这里报错,我觉得好像没有什么问题啊?请指教!
[解决办法]
for (int i = 0;i <20;i++)
{
*b=i;
cout < < "b[i] is : " < <*b++ < <endl;
}
这里有问题 b的值被改拉 改成下面这样就可以拉
for (int i = 0;i <20;i++)
{
b[i]=i;
cout < < "b[i] is : " < <b[i] < <endl;
}
[解决办法]
b的值改了 跟楼上说的一样 b++最后指到了数组的最后一个元素。这样只能delete b;把
b[19]给删除。
[解决办法]
*b++ 把 b指向了 申请的内存位置的末尾,
结果 delete 释放非法空间。
[解决办法]
for (int i = 0;i <20;i++)
{
*b=i;
cout < < "b[i] is : " < <*b++ < <endl;
}
b -= 20; //把 b 后退回空间起始位置 ~
[解决办法]
这里b++一直在做,最后指到了申请的内存的最后面,所以delete[]的时候出错.
两种改法,一种像楼主几位说的.
另一种也可以另外申请一个指针,用它来代替b进行++的运算,如下面:
unsigned int *go;
go=b;
for (int i = 0;i <20;i++)
{
*go=i;
cout < < "b[i] is : " < <*go++ < <endl;
}
/...../
delete []b; //没问题了,因为b还是指向那块数组的头部