首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问个初学者有关问题

2012-02-29 
问个菜鸟问题代码如下:#includeiostreamusingnamespacestdvoidmain(){unsignedint*a,*bstructdt{unsig

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

热点排行