动态数组的简单认识:
动态数组的内存空间是从堆动态分配的。是通过执行代码而为其分配存储空间。当程序执行到我们编写的分配语句时,才为其分配。对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则将会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。所以相对于静态数组的来说我们对于使用动态数组有很大的自由度。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i;
int *arr;
printf("请输入所要创建的一维动态数组的长度:");
scanf("%d",&n);
arra=(int*)calloc(n,sizeof(int));// 此处的array其实就是动态数组的数组名,平常说数组名就是数组首地址,那么这里动态申请的内存也就是数组的大小。。。
for(i=0;i<n;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
for(i=0;i<n;i++)
{
arr[i]=i+1;
printf("%d\t",arr[i]);
}
free(arr);
return 0;
}
只是为了简单的测试对于动态数组的浅显认识,因此一个简单的代码。当然,这只是动态一维的, 二维的动态数组和一维的相类似。
众所周知,二维数组一般行主序arr[i][j], 其实动态的二维数组的建立和一维一样,首先先建立“行”在建立“列”。
测试代码:
int main()
{
int n1;
int n2;
int **arr;
int i;
int j;
printf("请输入所要创建的动态数组的第一维长度:");
scanf("%d",&n1);
printf("请输入所要创建的动态数组的第二维长度:");
scanf("%d",&n2);
arr=(int**)malloc(n1*sizeof(int*)); //"行"
for(i=0;i<n1; i++)
{
arr[i]=(int*)malloc(n2* sizeof(int));//列
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
arr[i][j]=i*n2+j+1;
printf("%d\t",arr[i][j]);
}
printf("\n");
}
for(i=0;i<n1;i++)
{
free(arr[i]);//释放列
}
free(arr);//释放行
return 0;
}
在建立动态数组时,特别是多维的时,一定需要注意应该从外到内。比如:arr=(int**)malloc(n1*sizeof(int*)); 这是建立“行”。然后再用一个for循环逐次建立“列”, 比如:for(i=0;i<n1; i++)
{
arr[i]=(int*)malloc(n2* sizeof(int));//列
}
建立完当然就是释放了。释放时刚好与建立时的顺序相反,由内到外,先释放“列”比如:for(i=0;i<n1;i++)
{
free(arr[i]);//释放列
}
然后再释放“行” ,比如:free(arr);//释放行
所以说,建立动态数组的方法是一定的,不论是几维的。
由于初学水平有限,请多提意见,一起交流。。。