二维数组的动态创建和释放
创建二维数组优先分配行指针的内存,这样才能保证二维数组的行地址内存是连续的(这里的内存连续是指每一个行指针地址之差值相同,这个差值就是每个一维数组的长度)。如果是采取一个一个申请一维数组,那无法保证这些一维数组所形成的二维数组行指针内存连续
第一种方式:使用malloc free
先看一维数组的
1.动态开辟一维数组
//动态开辟一维数组
void dynamicCreate1Array()
{undefined
int m;
int i;
int *p;
printf("请输入开辟的数组长度:");
scanf("%d",&m);
p = (int*)malloc(sizeof(int)*m);//动态开辟
printf("请输入数据:");
for(i = 0; i < m ; i++)
scanf("%d",&p[i]);
printf("输出数据:\n");
for(i = 0; i < m; i++)
printf("%d ",p[i]);
free(p);
p=NULL
}
//动态开辟二维数组
void dynamicCreate2Array()
{undefined
int m,n;
int i,j;
int **p;
printf("请输入数组行和列:");
scanf("%d%d",&m,&n);
p = (int**)malloc(sizeof(int*)*m); //开辟行
for(i = 0; i < m; i++)
{
*(p+i) = (int*)malloc(sizeof(int)*n);//开辟列
}
//输入数据
printf("请输入数:");
for(i = 0 ; i < m;i++)
for(j = 0; j < n;j++)
scanf("%d",&p[i][j]);
//输出数据
for(i = 0 ; i < m;i++)
{
for(j = 0; j < n;j++)
{
printf("%3d ",p[i][j]);
}
printf("\n");
}
//释放开辟的二维空间
for(i = 0; i < m;i++)
free(*(p+i));//释放每一行
free(p);//最后释放二维指针变量
p=NULL;
野指针
前面提到,指针消亡,并不意味着其所指向的内存会被自动释放,同样,释放动态内存,并不意味着指针会消亡,也不意味着指针的值会改变,如下所示:
//假设p是代码块内声明的局部指针变量,在代码块执行完毕退出时,p自动消亡,但p指向的大小为8、类型为int的内存空间不会释放掉。
//代码退出后,程序无法再通过指针p释放所申请的动态内存,这块内存已经“泄露——————内存泄漏
int *p=new int[8];
…
//运行以后,指针p非但不会消亡,其值还会保持不变,并不会变为null。此时使用if(指针!=null)进行处理也无法起到防错作用。
delete [] p;
解决方法:指针被free或者delete后,一定要置为null,没有置为null的指针常称为”野指针“。
第二种方式:使用new delete
先看一维数组的
cout<<"请输入长度:";
cin>>len;
int *p = new int[len];
cout<<"请输入数据:";
for(int i = 0; i < len; i++)
cin>>p[i];
cout<<"输出数据:"<<endl;
for(i = 0; i < len; i++)
cout<<setw(4)<<p[i];
delete[] p;
p=NULL;
二维数组的
int m,n;
cout<<“请输入行和列:”;
cin>>m>>n;
//动态开辟空间
int **p = new int*[m]; //开辟行
for(int i = 0; i < m; i++)
p[i] = new int[n]; //开辟列
cout<<"请输入数据:";
for(i = 0 ; i < m ; i++)
for(int j = 0; j < n; j++)
cin>>p[i][j];
cout<<"输出数据:"<<endl;
for(i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
cout<<setw(3)<<p[i][j];
cout<<endl;
}
//释放开辟的资源
for(i = 0; i < m; i++)
delete[] p[i];
delete[] p;
p=NULL;