目的是将,将数组arr1的数据复制到动态申请的空间里,并显示出来。
错语代码:
void main()
{
int arr1[5]={1,2,3,4,5};
int *pa=arr1;
int *p=new int[5];
for(int i=0;i<5;i++)
*p++=*pa++;
for(int i=0;i<5;i++)
cout<<*p++<<' ';
cout<<endl;
for(int i=0;i<5;i++)
cout<<*pa++<<' ';
delete []p;
_getch(); //输入任意键,返回系统
return 0;
}
运行结果: 显示出来的数据很大,不是原来数组arr1元素,而且运行时程序发生中止出错。
分析原因:
原来是在
for(int i=0;i<5;i++)
*p++=*pa++;
运行后,指针p与指针pa所指向的地址都发生了改变,而不是指向数组arr1的首地址了。
同时因为运行
for(int i=0;i<5;i++)
cout<<*p++<<' ';
后 超出p所指向的空间,所以发生中止。
正确修改如下:
void main()
{
int arr1[5]={1,2,3,4,5};
int *pa=arr1;
size_t sz=sizeof(arr1)/sizeof(*arr1);
int *p=new int[sz];
for(int i=0;i<5;i++)
*p++=*pa++;
for(int i=0;i<5;i++)
cout<<*(p-5+i)<<' ';//指向开始地址
cout<<endl;
pa=arr1;//重新指向数组arr1
for(int i=0;i<5;i++)
cout<<*pa++<<' ';
p-=5;//返回初值指针,不然运行delete []p;时中止
delete []p;
_getch(); //输入任意键,返回系统
return 0;
}
数组复制时,细节值得注意!