第二十章| 指標- malloc()、free()、calloc() 與realloc()

文章推薦指數: 80 %
投票人數:10人

C語言教學,指標- malloc()、free()、calloc() 與realloc(),都是事先宣告好所要使用的變數,當程式開始執行時,這些變數就會自動被配置記憶體空間。

Thiswebsite Archives Categories Tags About Donate RSS 歡迎!您似乎正在使用廣告攔截器。

請考慮通過禁用您的廣告攔截器來支持我。

J.J.Huang   2019-10-24   C   瀏覽次數:次 {{moment(1571878800000).fromNow()}} C語言-第二十章|指標-malloc()、free()、calloc()與realloc() 前置作業由於很多語法在C++裡面,很多的語法、型態、轉型⋯等等,都非常的嚴謹,而教材又有點年紀了。

將專案修改為C專案,請參考在VisualStudio2019中建立和執行C專案 刪除.cpp檔 新增項目Source.c 專案->屬性->C/C++->所有選項->尋找「編譯」->編譯成「編譯成C程式碼(/TC)」 什麼是malloc()、free()、calloc()與realloc()?到目前為止,都是事先宣告好所要使用的變數,當程式開始執行時,這些變數就會自動被配置記憶體空間。

然而有時有些變數並不知道何時會被使用,若希望在使用到的時候再配置空間給變數,並在變數不使用的時候,將變數所佔有的空間還給記憶體,這時候可以使用malloc()與free()函式。

1int*ptr=malloc(sizeof(int)); malloc()運算子會配置一個int需要的空間,並傳回該空間的位址,所以使用指標ptr來儲存這個位址,這段程式只配置空間但不初始空間中的儲存值。

12345678910111213141516171819#include#includeintmain(){int*ptr=malloc(sizeof(int));printf("空間位置:%p\n",ptr);printf("空間儲存值:%d\n",*ptr);*ptr=200;printf("空間位置:%p\n",ptr);printf("空間儲存值:%d\n",*ptr);free(ptr);return0;} 使用malloc()函式動態配置的空間,在整個程式結束前並不會自動歸還給記憶體,必須使用free()函式將空間還給記憶體,如上面的程式在結束前所作的動作。

在這個程式中,雖然顯示完畢後程式也就結束,但這邊還是示範了free()的用法,而這也是個好習慣,日後程式在持續執行過程中,若大量使用malloc()而沒有適當地使用free()的話,由於空間一直沒有歸還,最後將導致整個記憶體空間用盡。

來看一個簡單的動態記憶體配置的應用,陣列使用的一個缺點,就是陣列的大小必須事先決定好,然而有時候無法知道要使用多大的陣列,或者希望由使用者自行決定陣列大小,這時候就可以使用動態記憶體配置,加上指標運算來解決這個問題,先說明陣列動態配置的方式。

1int*arr=malloc(1000*sizeof(int)); 這段程式碼動態配置了1000個int大小的空間,並傳回空間的第一個位址,配置後的空間資料是未知的,可以使用calloc()來宣告空間配置。

1int*arr=calloc(1000,sizeof(int)); 這個程式將宣告1000個int大小的空間,並將所有的空間值初始為0。

同樣地,使用malloc()或calloc()配置得來的空間,在不使用時應該使用free()釋放。

1free(arr); 1234567891011121314151617181920212223242526272829303132#include#includeintmain(){intsize=0;printf("請輸入陣列長度:");scanf("%d",&size);int*arr=malloc(size*sizeof(int));printf("顯示元素值:\n");for(inti=0;i#includeintmain(){intm=0;intn=0;printf("輸入二維陣列維度(m*n):");scanf("%d*%d",&m,&n);int*ptr=malloc(m*n*sizeof(int));for(inti=0;i#includeintmain(){intsize=0;printf("請輸入陣列長度:");scanf("%d",&size);int*arr1=malloc(size*sizeof(int));printf("指定元素值:\n");for(inti=0;i



請為這篇文章評分?