使用malloc和free函數進行內存動態分配

                 1、在學習c語言裏面,內存分配這個話題很是有意思,由於咱們平時在開發的時候,若是一不當心沒注意內存釋放的話,寫的的程序很容易出錯,因此今天就來回顧一下c語言裏面的內存動態分配,下面咱們先來看一個實例來進行分析數組

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 int main(void)
 4 {
 5     int a[5] = {4, 10, 2, 8, 6};
 6     int len;
 7     printf("請輸入數組的長度大小:len= ");
 8     scanf("%d",&len);
 9     int * pArr = (int *)malloc(sizeof(int) * len);
10     *pArr =4;
11     pArr[1] =10;a
12     printf("%d %d\n", *pArr, pArr[1]);
13     free(pArr);
14 
15     return 0;
16 }

程序代碼說明:函數

        一、(int *)malloc(sizeof(int) * len)這句話的意思是:學習

                a、這裏使用了函數sizeof返回數據類型爲int 的數組字節個數,同時這裏要注意咱們這裏寫的malloc函數只有一個形參,表示要求系統分配的字節數spa

                b、malloc函數的功能是請求系統sizeof(int) * len個字節的內存空間,若是請求分配成功的話,則返回第一個字節的地址,若是分配不成功的話,則返回NULL。code

                c、malloc函數能且只能返回第一個字節的地址,因此咱們須要把這個無實際意義的第一個字節的地址(俗稱乾地址)轉化爲有實際意義的地址,因此malloc函數前面必須加(數據類型  *),表示把這個無實際意義的地址轉爲相應數據類型的地址。blog

               d、因此這裏這句話的意思是把系統分配好的20個字節的第一個字節的地址轉爲四個字節,這樣p就指向了第一個的四個字節,pArr+1就指向了第2個的四個字節,pArr+i就指向了第i+1個的四個字節。pArr[0]就是第一個元素,pArr[i]就是i+1個元素內存

       二、經過上面的分析,上面的代碼*pArr=4(也能夠寫成a[0]=4),pArr[1]=10(也能夠寫成a[1]=10),同時在分配了20個字節的系統內存後,使用了free()函數進行了釋放內存,這樣就不會形成系統內存的浪費開發

       三、最終結果爲:io

  

          2、接下來我使用for循環來訪問數組,代碼以下:for循環

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 int main(void)
 4 {
 5     int a[5] = {4, 10, 2, 8, 6};
 6     int len;
 7     int i=0;
 8     printf("請輸入數組的大小:len= ");
 9     scanf("%d",&len);
10     int * pArr = (int *)malloc(sizeof(int) * len);
11     for( i=0; i<len;++i)
12     {
13         scanf("%d",&pArr[i]);
14     } 
15     for(i=0;i<len;++i)
16     {
17         printf("%d\n",*(pArr+i));
18     }
19     free(pArr);
20 
21     return 0;
22 }

 運行結果以下:

       

         3、跨函數使用內存例子:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 struct student
 4 {
 5     int sid;
 6     int age;
 7 };
 8 struct student * creatstudent(void);
 9 void showstudent(struct student *);
10 int main(void)
11 {
12     struct student  *ps ;
13     ps=creatstudent();
14     showstudent(ps);
15     
16     free(ps);
17     return 0;
18 }
19 void showstudent(struct student *pst)
20 {
21     printf("%d %d\n",pst->sid, pst->age);    
22 }
23 struct student * creatstudent(void)
24 {
25     struct student * p =(struct student *)malloc(sizeof(struct student));
26     p->sid=99;
27     p->age=21;
28     return p;
29 }

   運行效果以下:

      

  程序說明:

      這裏咱們經過創建函數來分配內存單元,來達到內存靈活分配使用。

相關文章
相關標籤/搜索