很多时候,我们都无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。在 C++ 中,我们可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。如果不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。
int main ()
{
double* pvalue = NULL; // 初始化为 null 的指针
pvalue = new double; // 为变量请求内存(任意数据类型分配)
*pvalue = 29494.99; // 在分配的地址存储值
cout << "Value of pvalue : " << *pvalue << endl;//*pvalue=29495
delete pvalue; // 释放内存
return 0;
}
一维数组
{
int *array=new int [m];// 动态分配,数组长度为 m
delete [] array;//释放内存
}
二维数组
{
int **array// 假定数组第一维长度为 m, 第二维长度为 n
array = new int *[m];// 动态分配空间
for( int i=0; i<m; i++ )
array[i] = new int [n];
for( int i=0; i<m; i++ )
delete [] array[i];//释放
delete [] array;
}
三维数组
{
int ***array;// 假定数组第一维为 m, 第二维为 n, 第三维为h
array = new int **[m];// 动态分配空间
for( int i=0; i<m; i++ )
{
array[i] = new int *[n];
for( int j=0; j<n; j++ )
array[i][j] = new int [h];
}
for( int i=0; i<m; i++ )
{
for( int j=0; j<n; j++ )
delete[] array[i][j];
delete[] array[i];
}
delete[] array;//释放
}
在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配,并且由自己负责释放内存。
对于动态数组,其创建麻烦,我们使用完必须由自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。
使用动态数组的原因:
通过内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
构建动态数组的原则:
申请的时候从外层往里层,逐层申请;
释放的时候从里层往外层,逐层释放。
n维数组需要n维指针。
void *malloc(int size);//申请size字节堆空间
void *calloc(int num, int size);//按类型申请num个size堆空间
void free(void *p);//释放p指向的堆空间
void *realloc(void *p,int size);//将p指向堆空间变为size
void*可变 ,例如:double *pd=NULL; pd=(double *)calloc(10,sizeof(double));
PS:动态数组可以多次申请,往后延续
通常会加入if语句判断是否成功构造动态数组
{//array[n1][n2][n3]
int i,j,k;
int n1,n2,n3;
int ***array;
scanf("%d%d%d",&n1,&n2,&n3);
array=(int***)calloc(n1,sizeof(int**));
//最外层指针是array,它是个三维指针,所指向的是array[],其为二维指针
for(i=0;i<n1;i++)
{
array[i]=(int**)calloc(n2,sizeof(int*));
//次层指针是array[],它是个二维指针,所指向的是array[][],其为一维指针
for(j=0;j<n2;j++)
{
array[i][j]=(int*)calloc(n3,sizeof(int));
//最内层指针是array[][],它是个一维指针,所指向的是array[][][],其是个整型常量
for(k=0;k<n3;k++)
{
array[i][j][k]=i+j+k+1;
}
}
}
//释放动态数组
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
free(array[i][j]);//释放第三维指针
}
}
for(i=0;i<n1;i++)
{
free(array[i]);//释放第二维指针
}
free(array);//释放第一维指针