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 }
運行效果以下:
程序說明:
這裏咱們經過創建函數來分配內存單元,來達到內存靈活分配使用。