两组数组之间复制容易出错地方

来源:互联网 发布:ubuntu可以安装在u盘 编辑:程序博客网 时间:2024/05/17 00:15

目的是将,将数组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;   
}


数组复制时,细节值得注意!


原创粉丝点击