《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 }

該代碼的運行結果為:

 

請輸入所要創建的一維動態數組的長度: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

總結:可以看出,動態三維數組的創建與釋放與前面的一維和二維相類似,同樣要注意創建的原則。
 大家可以看到,前面所說的一維,二維,三維動態數組都是一次性創建好的,如果在使用過程中要對數組進行擴展或者刪減該怎么辦呢?
 那就要用到這個--可擴展動態數組。關於可擴展動態數組,我將在后續的文章中闡述。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM