C语言:内存的分配与管理
生活随笔
收集整理的這篇文章主要介紹了
C语言:内存的分配与管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、內存區域的劃分標準:
代碼段 ? ? ? ? ? ? 存儲代碼 數據段 ? ? ? ? ????靜態/全局數據、常量(const)?? ?? 堆區(heap) ? ? ? ? ??動態內存分配(更靈活的設置容器大小存儲數據) 棧區(stack) ? ? ?? ?局部變量、函數參數 2、內存分配方式的原理:靜態分配和動態分配 ? ? ? ? ?靜態分配:編譯器在處理程序源代碼時分配(變量) ? ? ? ? ?動態分配:程序執行時按動態要求來分配(由程序員來決定,用完得人為釋放) ? ? ? ? ?比較:靜態的程序執行前分配,效率高,靈活差,對象是有名字的變量,內存分配和釋放由編譯器完成;動態對象沒有名字的變量,通過指針間接地對它進行操作。 ? 3、理解野指針的概念: ? ? ?概念:野指針不是空(NULL)指針,二是指向不屬于自己的內存指針。 ? ? ?三種形式: ? ? (1)指針變量沒有被初始化。 ? ? (2)指針p被free或者delete之后,沒有將其置NULL,但是p仍然指向這塊已經不屬于自己的內存。 ? ? (3)通過函數返回局部變量的地址。局部變量存放在stack棧中,函數一被執行完,在這個棧中的數據就會被釋放,此時返回的指針就沒有了指向,也就是函數中的那一塊內存已經不屬于返回的這個指針了。 ? 4、內存泄露的概念: ? ? ? ? 內存被分配后被系統記錄,但是用完了,最后沒有被釋放,記錄也就沒有被刪除此時內存一直被占用,即為內存泄露。類似于圖書館,好借好還。 ? 5、理解malloc函數原型的含義: ? ?? #include<stdlib.h> ? ? ? ? malloc 函數原型: ?? void *?malloc(unsigned int size);? ? ? ? ?通用類型指針,真正使用時,需要強制轉換為要使用的類型 ? ? ? ? 說明:(1)、size這個參數的含義是分配的內存的大小(以字節為單位) ?(2)、返回值:失敗,則返回值為NULL(空指針)。成功,則返回是一個 指向空類型(void)的指針,即所分配內存塊的首地址。 ? ? ? ?記住:先對返回值做判斷?如果為空,分配內存失敗。反之,申請成功。 ? ? ? ? (1) 用malloc申請一塊只保存一個整型類型的內存 ? ? ? ? ? ? ? ? int *p = (int*)malloc(sizeof(int) ? ? ??(2)?用malloc申請一塊能夠保存25個整型類型的內存 ? ? ? ? ? ? ? ? int *p = (int *)malloc(sizeof(int)*25) ? ? ? 對動態空間的訪問方式 ? ? ? 對單一內存的訪問 ? ? ? *p = 100; ? ? ? 對動態數組的訪問 ? ? ? p[1];*(p+1);(p+1) ? ? ?數組存儲數據時: ? ? ? ?*(p+i)//循環存儲數據過程中,p所指向的一塊內存首地址一直沒有變過,變化的只是數據在這一塊內存中存放的位置。測試過 ? ? ? ?*p++;//循環存儲數據中,p所指向的內存首地址一直在變化,其實,就是一塊內存只是存放了一個數據,p就移動指向了另一塊空間首地址,接著存下一個數據。測試過 ? 6、釋放內存的函數free的含義: ? ? ? 函數原型:free (void *block)//釋放的必須是malloc返回的地址 ? ? 說明:動態內存的申請和釋放必須配對 ? 7、注意事項: (1)如果函數參數是一個指針,不要指望指針自己去申請動態內存。也就說指針必須指向一個有效的內存區域。 (2)指針消亡了,p=NULL并不代表它所指向的內存會被自動釋放;內存被釋放了,free(p)并不代表指針會消亡或者成了空指針。必須兩者結合。 (3)malloc分配內存后,程序結束前必須使用free()將已分配的內存空間釋放。malloc和free必須是一對一的關系,不能一對多即過度釋放。 ? ? 8、知識拓展: ? (1)使用calloc函數分配動態內存 ? ? ? ? ? 函數原型:void *calloc(unsigned n,unsigned size ); ? ? ? ? ? 作用是:在內存的動態存儲區中分配n個長度為size的連續空間,這個空間一般比較大,足以保存一個數組。 ? ? ? ? ? 意義:用calloc函數可以為一維數組開辟動態的存儲空間,n為數組元素個數,每個元素長度為size。這就是動態數組。函數返回指向所分配域的起始位置的指針;如果分配不成功,返回NULL。 ? ? ? ? ? 例如: p = calloc(50,4);//開辟50*4個字節的臨時分配域,把起始地址賦給指針變量p ? ? ? ?(2)使用realloc函數分配動態內存 ? ? ? ? ? ?函數原型:void* realloc(void *p,unsigned int size); ? ?作用:如果已經通過malloc函數或將calloc函數獲得了動態空間,想改變其大小,可以用realloc函數重新分配。 ? ?意義:用realloc函數將p所指向的動態空間的大小改變為size。p的指向不變,如果分配不成功,返回NULL。?
轉載于:https://www.cnblogs.com/XYQ-208910/p/4726365.html
總結
以上是生活随笔為你收集整理的C语言:内存的分配与管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA 11383 Golden Tig
- 下一篇: Mac下批量删除.svn文件