C語言中 記憶體的申請與釋放

來源:互聯網
上載者:User
記憶體的申請與釋放

對於一段記憶體的數存,該如何解釋,是依賴於資料類型,需要使用 malloc,其使用文法如下:

 void *     malloc(size_t size);

函數 malloc 包含在標頭檔為 stdlib.h 的標頭檔中,使用前需要把它包含進來,其傳回值是 void *,其含義是:傳回值自訂,有我們使用者決定,定義的是接收整型的記憶體,傳回值就是整型的指標,定義的是接收字元型的記憶體,傳回值就是字元型的指標.下面是一個例子:

int *pMyInt = (int*)malloc(sizeof(int))

在這裡,我們使用的是int*,所以,malloc分配的空間所儲存的類型就是int型,其聲明的pMyInt所指向的事malloc所份哦誒記憶體的首地址

記憶體配置之後,要判斷記憶體是否申請成功。在這裡,我們使用if語句判斷:若記憶體為空白,則證明記憶體申請成功,否則,需要終止程式.

if (NULL != myString){    printf("Allocate memory error!");    exit(1);

記憶體申請成功後,需要對記憶體進行初始化,需要使用 memset 函數,其存在的庫為 String, 所以檔案要包含 String.h 這個標頭檔,其基本文法:

void *     memset(void *b, int c, size_t len);

memset 的功能是實現記憶體的初始化, void *b 是字串數組的名字,也是地址, c 是具體的地址, len 是指的字元的個數,下面就是一個執行個體, myString 是字元數組的名字,0x00是初始化的首地址, nSize 是申請的個數,可以是具體值,這裡的是根據使用者的輸入而設定的一個值.

memset(myString,0x00,nSize);

接下來就是要由使用者輸入想要的字元個數,以及字元.在蘋果 Mac 下的 Iterm 中,用蘋果的鍵盤輸入的話,會涉及到鍵盤緩衝區的概念.具體就是輸入字元時,需要輸入一個字元,然後換行,再輸下一個,當從迴圈中再次執行時,系統就會預設遇到斷行符號鍵,就是’\n’, 這時候就會跳過去此次迴圈.等到下次在執行是才會繼續讓輸入,本質就是每隔一個字元存放位存放,導致記憶體浪費,使用者的目的也達不到.

於是, fpurge 函數就應運而生了,其文法結構為:

int     fpurge(FILE *stream);

fpurge函數的作用是重新整理檔案流,當用 fpurge(stdin); 時,就是重新整理鍵盤的輸入緩衝區,這樣就不存在’\n’ 的問題啦

記憶體使用量之後,一定要記得釋放掉記憶體,因為 malloc 申請的記憶體是從堆中申請的,是使用者唯一能手動管理的記憶體部分,如果使用後不釋放掉,就會一直佔用記憶體.長此以往,我們將會無記憶體可用

free(myString);

釋放完記憶體後,?需要把前面定義的字元型指標給釋放掉.願意很簡單,不設為空白的話,後面在調用指標 myString 時,它仍指向 malloc 分配的記憶體首部,然而 malloc 分配的記憶體已經釋放掉了,這樣就會出現錯誤.

以下就是我在學習記憶體配置中寫的小例子:

本例在蘋果的系統下的 Iterm 中啟動並執行.它使用了 argv[1],指的是在命令列輸入的第二個字元,使用者在命令列就輸入需要的位元組大小

  1 #include<stdio.h>  2 #include<string.h>  3 #include<stdlib.h>  4   5 //根據使用者從鍵盤輸入的內容,然後在螢幕上列印  6   7 int main(int argc,const char *argv[])  8 {  9     char *myString = NULL; 10     char myChar; 11     int j =0; 12     myChar = fgetc(stdin); 13     int nSize = atoi(argv[1]); 14  15     myString = (char*)malloc(sizeof(char) * nSize); 16     //記憶體申請好之後,需要判斷是否為空白,若為空白,則證明記憶體申請成功 17     if (NULL != myString) 18     { 19         printf("Allocate memory error!"); 20         exit(1); 21     } 22     //記憶體配置好之後,需要進行記憶體的初始化 23     memset(myString,0x00,nSize); 24     for (int i = 0;i < nSize - 1;i++) 25     { 26         //使用 fpurge 來清空鍵盤緩衝區中的記憶 27         fpurge(stdin); 28         myString[i] = myChar; 29         myChar = fgetc(stdin); 30     } 31  32     printf("the myString is %s\n",myString); 33 //記憶體使用量之後,一定要記得釋放掉記憶體,因為 malloc 申請下的記憶體都是在堆中申請的,如果不釋放掉, 會一直佔用記憶體空間,長此以往,我們將沒有可用的記憶體 34     free(myString); 35     //此處把 myString 設為空白的原因就是,如果不設為空白,後面在重新使用時, myString 仍指向原來的地址,而那地址裡的內容已釋放,就會出現錯誤,所以 myString 設為空白 36     myString = NULL; 37     return 0; 38  39 }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.