首页 > 代码库 > 《C语言中动态数组的创建及引用》

《C语言中动态数组的创建及引用》

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 }

该代码的运行结果为:

 

请输入所要创建的一维动态数组的长度:121    2    3    45    6    7    89    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请输入所要创建的动态数组的第二维长度:31    2    34    5    67    8    910    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请输入所要创建的动态数组的第三维长度:30    1    23    4    56    7    83    4    56    7    89    10    116    7    89    10    1112    13    14

总结:可以看出,动态三维数组的创建与释放与前面的一维和二维相类似,同样要注意创建的原则。
 大家可以看到,前面所说的一维,二维,三维动态数组都是一次性创建好的,如果在使用过程中要对数组进行扩展或者删减该怎么办呢?
 那就要用到这个--可扩展动态数组。关于可扩展动态数组,我将在后续的文章中阐述。