title: C语言中的动态数组
tags:

  • C
  • 指针
    abbrlink: 83e532aa
    date: 2021-03-14 09:27:04

什么是动态数组

这里先引入一段对动态数组的说法

动态数组是相对于静态数组而言,从“动”字我们也可以看出它的灵活性,静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆动态分配的。是通过执行代码而为其分配存储空间。当程序执行到我们编写的分配语句时,才为其分配。对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则将会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。所以相对于静态数组的来说我们对于使用动态数组有很大的自由度。

同时,动态数组的创建还需要遵循一个原则,就是在创建的时候从外层往里层,逐层创建,释放的时候相反,是从里往外释放。

一维动态数组的创建

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int n1,i;
  6. int *array;
  7. printf("请输入所要创建的一维动态数组的长度:");
  8. scanf("%d",&n1);
  9. array=(int*)calloc(n1,sizeof(int));
  10. for(i=0;i<n1;i++)
  11. {
  12. printf("%d\t",array[i]);
  13. }
  14. printf("\n");
  15. for(i=0;i<n1;i++)
  16. {
  17. array[i]=i+1;
  18. printf("%d\t",array[i]);
  19. }
  20. free(array);//释放第一维指针
  21. return 0;
  22. }

二维动态数组的创建

  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. int main(){
  5. int num1,num2;
  6. cout<<"请输入动态二维数组的第一个维度:";
  7. cin>>num1;
  8. cout<<"请输入动态二维数组的第二个维度:";
  9. cin>>num2;
  10. int **array = (int **)calloc(num1,sizeof(int));
  11. for(int i=0;i<num1;i++) {
  12. array[i] = (int*)calloc(num2,sizeof(int));
  13. }
  14. for(int i=0;i<num1;i++){
  15. for(int j=0;j<num2;j++){
  16. array[i][j] =i*num2+j+1;
  17. printf("%d\t",array[i][j]);
  18. }
  19. cout<<endl;
  20. }
  21. for(int i=0;i<num1;i++) free(array[i]);
  22. free(array);
  23. return 0;
  24. }

总结

综上,我们便可以知道如何创建动态数组,以二维动态数组为例,先从外层往里层,逐层创建

  1. int **array=calloc(num1,sizeof(int*)); //第一维

然后接着创建第二层

  1. array[i]=calloc(num2 ,sizeof(int));//第二维

销毁的时候相反,从里往外逐层销毁,先来释放里层

  1. for(i=0;i<n1;i++)
  2. {
  3. free(array[i]);//释放第二维指针
  4. }

接着释放外层

  1. free(array);//释放第一维指针