C语言中动态数组的创建及引用
动态数组是相对于静态数组而言的,静态数组的长度是预定义好的,在整个程序中,一旦给定了数组大小后就无法改变,
,而动态数组则不然,它可以根据程序需要重新指定数组的大小。动态数组的内存空间是由堆动态分配的,通过执行代码为其
分配储存空间,只有程序执行到分配语句时,才为其分配储存空间。
对于动态数组,其创建比静态数组更麻烦一些,使用完必须由程序员自己释放,否则将引起内存泄漏,但是其使用非常灵活,能根据程序需要动态分配大小,因此相对于静态数组来说,使用动态数组的*度更大。
对于动态数组的创建和引用我们尤其需要注意的便是它的创建原则。
动态数组的创建原则:从外层项里层创建,从里层向外层逐渐释放。
下面通过代码实例来看看:
一:一维动态数组
创建一维动态数组的一般格式:
类型说明符 * 数组名 = (类型说明符 * )malloc(数组长度 * sizeof(类型说明符));
代码实例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int n,i; 6 int *arr; 7 printf("请输入所要创建的一维动态数组的长度:"); 8 scanf("%d",&n); 9 if((arr=(int *)malloc(n*sizeof(int)))==NULL) 10 { 11 printf("分配内存空间失败,程序退出!"); 12 return 0; 13 } 14 for(i=0;i<n;i++) /*向申请成功的数组中赋值*/ 15 { 16 arr[i]=i+1; 17 printf("%d\t",arr[i]); 18 if(0==(i+1)%4) 19 printf("\n"); /*一行打印四个元素*/ 20 } 21 free(arr); /*切记!使用完后记得要释放所申请的空间*/ 22 return 0; 23 }
该代码的运行结果为:
请输入所要创建的一维动态数组的长度:12 1 2 3 4 5 6 7 8 9 10 11 12
点评:程序先使用了malloc()函数向系统动态申请分配了sizeof(int)*n个字节的内存空间,然后将申请的内存空间视为一个
一维数组进行操作,当然,一维数组的申请并没有体现动态数组的分配原则。请看下面的实例。
二:二维动态数组
创建二维动态数组的一般格式:
类型说明符 ** 数组名 = (类型说明符 ** )malloc (第一维长度*sizeof(类型说明符 * ));
例如:
arr=(int **)malloc(n1*sizeof(int *));
for(i=0;i<第一维长度;i++)
{
数组名[i] = (类型说明符 * )malloc(第二维长度*sizeof(类型说明符));
}
代码实例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int n1,n2,i,j; 6 int **arr; 7 printf("请输入所要创建的动态数组的第一维长度:"); 8 scanf("%d",&n1); 9 printf("请输入所要创建的动态数组的第二维长度:"); 10 scanf("%d",&n2); 11 if((arr=(int **)malloc(n1*sizeof(int *)))==NULL) /*第一维的创建*/ 12 { 13 printf("分配内存空间失败,程序退出!"); 14 return 0; 15 } 16 for(i=0;i<n1;i++) /*创建第二维*/ 17 { 18 if((arr[i]=(int *)malloc(n2*sizeof(int)))==NULL) 19 { 20 printf("分配内存空间失败,程序退出!"); 21 return 0; 22 } 23 } 24 for(i=0;i<n1;i++) 25 { 26 for(j=0;j<n2;j++) 27 { 28 arr[i][j]=i*n2+j+1; /*为申请成功的数组中赋值*/ 29 printf("%d\t",arr[i][j]); 30 } 31 printf("\n"); 32 } 33 for(i=0;i<n1;i++) 34 { 35 free(arr[i]); /*先释放第二维*/ 36 } 37 free(arr); /*最后释放第一维*/ 38 return 0; 39 }
该代码的运行结果为:
请输入所要创建的动态数组的第一维长度:4 请输入所要创建的动态数组的第二维长度:3 1 2 3 4 5 6 7 8 9 10 11 12
总结:对动态数组的使用要有始有终,要牢记使用完后要及时释放所申请的内存空间,避免造成内存泄漏。
在创建和释放内存空间时要遵守原则:从外层向里层逐层创建,从里层向外层逐层释放。
三:三维动态数组
通过前面一维和二维动态数组的创建实例学习,相信大家已经可以准确推测出三维动态数组的一般创建格式了,
没错,就是形如如下的形式:
类型说明符 *** 数组名 = (类型说明符 *** )malloc(第一维长度*sizeof(类型说明符 **));
例如:
arr=(int ***)malloc(n1*sizeof(int **));
for(i=0;i<第二维长度;i++)
{
数组名[i]=(类型说明符 **)malloc(第二维长度*sizeof(类型说明符 *));
for(j=0;j<第三维长度;j++)
{
数组名[i][j]=(类型说明符 *)malloc(第三维长度*sizeof(类型说明符));
}
}
代码实例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int n1,n2,n3,i,j,k; 6 int ***arr; 7 8 printf("请输入所要创建的动态数组的第一维长度:"); 9 scanf("%d",&n1); 10 printf("请输入所要创建的动态数组的第二维长度:"); 11 scanf("%d",&n2); 12 printf("请输入所要创建的动态数组的第三维长度:"); 13 scanf("%d",&n3); 14 15 if((arr = (int ***)malloc(n1*sizeof(int **)))==NULL) /*第一维的创建*/ 16 { 17 printf("分配内存空间失败,程序退出!"); 18 return 0; 19 } 20 for(i=0;i<n1;i++) 21 { 22 if((arr[i] = (int **)malloc(n2*sizeof(int *))) == NULL) /*第二维的创建*/ 23 { 24 printf("分配内存空间失败,程序退出!"); 25 return 0; 26 } 27 for(j=0;j<n2;j++) 28 { 29 if((arr[i][j] = (int *)malloc(n3*sizeof(int))) == NULL) /*第三维的创建*/ 30 { 31 printf("分配内存空间失败,程序退出!"); 32 return 0; 33 } 34 } 35 } 36 for(i=0;i<n1;i++) /*为申请成功的数组中赋值*/ 37 { 38 for(j=0;j<n2;j++) 39 { 40 for(k=0;k<n3;k++) 41 { 42 arr[i][j][k]= i * n1 + j * n2 + k ; 43 printf("%d\t",arr[i][j][k]); 44 } 45 printf("\n"); 46 } 47 printf("\n"); 48 } 49 /*内存的释放*/ 50 51 for(i=0;i<n1;i++) 52 { 53 for(j=0;j<n2;j++) 54 { 55 free(arr[i][j]); /*释放第三维*/ 56 } 57 } 58 59 for(i=0;i<n1;i++) 60 free(arr[i]); /*释放第二维*/ 61 62 free(arr); /*释放第一维*/ 63 64 return 0; 65 }
请输入所要创建的动态数组的第一维长度:3 请输入所要创建的动态数组的第二维长度:3 请输入所要创建的动态数组的第三维长度:3 0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 9 10 11 6 7 8 9 10 11 12 13 14
总结:可以看出,动态三维数组的创建与释放与前面的一维和二维相类似,同样要注意创建的原则。
大家可以看到,前面所说的一维,二维,三维动态数组都是一次性创建好的,如果在使用过程中要对数组进行扩展或者删减该怎么办呢?
那就要用到这个--可扩展动态数组。关于可扩展动态数组,我将在后续的文章中阐述。