您好,登錄后才能下訂單哦!
本篇內容主要講解“C語言中的動態內存分配實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C語言中的動態內存分配實例分析”吧!
我們目前已經知道的內存開辟的方式有:
int val = 20;//在棧上開辟四個字節。 char arr[10] = { 0 };//在棧上開辟十個字節的連續空間
但是上述空間的開辟方式有兩個特點:
1.空間開辟的大小是固定的
2.數組在申明的時候,必須指定數組長度,它所需內存在編譯時分配。
顯然,這樣無法滿足有些場景的要求,有時我們所需要的空間大小只有在程序運行的時候才知道。這時我們就需要用到動態內存分配了。
void* malloc(size_t size);
這個函數向內存申請一塊連續可用的空間,并返回指向這塊空間的指針。
如果開辟成功,則返回一個指向開辟好空間的指針。
如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
返回值的類型是void*,所以malloc函數并不知道開辟空間的類型,具體在使用的時候由使用者來決定
如果參數size為0,malloc的行為是標準未定義的,取決于編譯器。
現在我們知道了如何去開辟空間,接下來,我們去學習一下如何將開辟的空間釋放掉。
void free(void* ptr);
C語言提供了另外一個函數free是專門用來釋放動態內存的
如果參數ptr指向的空間不是動態內存開辟的,那么free的行為是未定義的。
如果參數ptr是NULL指針,那么函數什么都不會做。
想使用malloc 和 free 都需要引入一個頭文件<stdlib.h>
接下來讓我們看個示例:
#include <stdlib.h> #include <stdio.h> int main() { int num = 0; scanf("%d", &num); int *ptr = (int*)malloc(sizeof(int) * num); //判斷是否開辟成功 if(NULL != ptr) { int i = 0; for(i = 0; i < num; i++) { *(ptr + i) = 0; } } free(ptr);//釋放空間 ptr = NULL; return 0; }
void* calloc(size_t num, size_t size);
函數的功能是為num個大小為size的元素開辟一塊空間,并且把空間的每個字節都初始化為0
malloc與calloc的區別在于calloc會在返回地址之前把申請的空間的每個字節都初始化為0
舉個例子:
#include <stdio.h> #include <stdlib.h> int main() { int *p = (int*)calloc(10, sizeof(int)); if(NULL != p) { int i = 0; for(i = 0; i < 10; i++) { *(ptr + i) = 0; } } free(p); p = NULL; retrun 0; }
所以如果我們對申請的內存空間的內容要求初始化,那么可以很方便的使用calloc函數來完成任務。
有時候我們會發現之前申請的空間太小,有時又會覺得申請的空間過大,那為了合理的使用內存,我們一定會對內存的大小做靈活調整。realloch函數就可以對動態開辟的內存大小進行調整
void* realloc(void* ptr, size_t size);
ptr 是要調整的內存地址
size 調整之后的新大小
realloc在調整內存空間后的返回值有兩種情況
情況一:原有空間之后有足夠大的空間,要擴展內存就直接在原有內存之后追加空間,原有空間的數據不變。
情況二:原有空間之后無足夠大的空間,擴展方法是在堆上另找一塊連續的空間來使用,這樣函數返回的就是一個新的內存地址
到此,相信大家對“C語言中的動態內存分配實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。