作者在 2008-07-09 22:58:23 发布以下内容
动态存储分配
关于动态存储分配,这里有一道很好的题目:
这道题实现了对一维数组的大小的改变。然后,还有一道改变二维数组大小的题目:
题目:
试编写一个函数ChangeSize2D 来改变一个二维数组的大小。上机测试该函数。
程序:
#include <iostream>
using namespace std;
using namespace std;
template<class T>
void ChangeSize2D(T** &a,int rows,int cols,int ToRows,int ToCols)
{
if(rows==ToRows&&cols==ToCols) return;
T** b;
b=new T*[ToRows];
for(int i=0;i<ToRows;i++)
{
b[i]=new T[ToCols];
}
void ChangeSize2D(T** &a,int rows,int cols,int ToRows,int ToCols)
{
if(rows==ToRows&&cols==ToCols) return;
T** b;
b=new T*[ToRows];
for(int i=0;i<ToRows;i++)
{
b[i]=new T[ToCols];
}
int m,n;
if(rows<ToRows)
{
m=rows;
}
else
{
m=ToRows;
}
if(cols<ToCols)
{
n=cols;
}
else
{
n=ToCols;
}
if(rows<ToRows)
{
m=rows;
}
else
{
m=ToRows;
}
if(cols<ToCols)
{
n=cols;
}
else
{
n=ToCols;
}
for(int x=0;x<m;x++)
{
for(int y=0;y<n;y++)
{
b[x][y]=a[x][y];
}
}
{
for(int y=0;y<n;y++)
{
b[x][y]=a[x][y];
}
}
for(int j=0;j<rows;j++)
{
delete [] a[j];
}
delete [] a;
{
delete [] a[j];
}
delete [] a;
a=b;
}
}
int main()
{
//2*3
int** a;
a=new int*[2];
a[0]=new int[3];
a[1]=new int[3];
{
//2*3
int** a;
a=new int*[2];
a[0]=new int[3];
a[1]=new int[3];
a[0][0]=100;
a[0][1]=101;
a[0][2]=102;
a[1][0]=110;
a[1][1]=111;
a[1][2]=112;
a[0][1]=101;
a[0][2]=102;
a[1][0]=110;
a[1][1]=111;
a[1][2]=112;
try
{
ChangeSize2D(a,2,3,2,2);
}
catch(const char* s)
{
cout<<s<<endl;
return 1;
}
{
ChangeSize2D(a,2,3,2,2);
}
catch(const char* s)
{
cout<<s<<endl;
return 1;
}
cout<<"a[1][2]="<<a[1][2]<<endl;
cout<<"a[1][1]="<<a[1][1]<<endl<<endl;
cout<<"a[1][1]="<<a[1][1]<<endl<<endl;
return 0;
}
}
结果:
a[1][2]=-33686019
a[1][1]=111
a[1][1]=111
Press any key to continue
值得注意的是,使用指针来动态创建数组时,数组的大小用户要记好(因为DEBUG时,不会检查到越界的问题)。只有new出来的空间,才能用delete回收。