读书人

问个初学者有关问题

发布时间: 2012-02-29 16:44:11 作者: rapoo

问个菜鸟问题
代码如下:
#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还是指向那块数组的头部

读书人网 >C++

热点推荐