【C语言重点难点精讲】C语言内存管理
文章目錄
- 一:相關動態內存函數
- (1)malloc和free
- (2)calloc
- (3)realloc
- 二:進程地址空間
- 三:常見內存錯誤
C語言內存管理其實是一個很糟糕的話題,很煩這個,但是沒有辦法,考試就愛考這些東西
一:相關動態內存函數
(1)malloc和free
int main() {//malloc返回值為void*,所以需要進行強轉int* p = (int*)malloc(sizeof(int) * 10);//malloc有可能申請失敗if (p == NULL) {printf("%s\n", strerror(errno));}else {for (int i = 0; i < 10; i++) {p[i] = i;}for (int j = 0; j < 10; j++) {printf("%d ", *(p + j));}}return 0;}free用于釋放mallco開辟的空間,malloc和free要成對使用,開辟的空間如果不使用了,一定要將其free掉,如果不free掉,堆區空間會越擠越大的(除非程序直接結束)。同時當那個指針所指空間free掉之后,由于指針其實還是已經保存了那片空間的地址,這個行為是相當危險的,因為找到指針就有可能會改變它,所以為了徹底斷絕他們的聯系,在free掉之后,要將指針置為NULL
free(p); p = NULL;(2)calloc
calloc函數和malloc函數的作用相同,都是用來動態開辟的。calloc與malloc所不同的是地方是兩者參數格式不一樣,并且calloc在開辟的同時會將此空間初始化為0, 而malloc則為隨機值
- malloc情況
calloc語法格式為
int* p=(int*) calloc(10,sizeof(int));(3)realloc
在申請好空間后,如果發現申請的空間不合適,過大或者過小,就可以使用realloc來進行調整
比如下面的例子中申請了20個字節后發現空間不夠,然后重新調整
需要注意:realloc申請空間有兩種方式
在堆區重新調整空間必然會遇到兩種情況,第一種原有的空間后面有足夠大的空間,那么申請時相當于就在原有空間后面補上缺的部分,這樣其返回的仍然是原來空間的地址;第二種原有的空間后面不夠大,realloc會重新找一片能完整存放的區域,然后把之前的內容照搬賦值過來,并釋放先前空間
二:進程地址空間
C/C++程序的地址空間排布如下
用一個例子說明如下
三:常見內存錯誤
1:對空指針進行解引用
2:越界訪問
動態內存指的是動態指的是在需求改變時我們可以隨時更改內存,但是它畢竟每次申請出來的也是一個確定的空間,所以你的指針不能跑到空間外面去
3:對非動態內存進行free
4:使用free釋放一塊動態開辟內存的一部分
free釋放的是開辟的空間的首位置,使用時指針不能變化,不然就非法釋放別的內存了
5:對同一塊動態內存多次釋放
6:內促泄漏
如果開辟的內存忘記釋放(當然是工程量大的情況),極易造成內存泄漏,而排查內存泄漏是一項很麻煩的事
總結
以上是生活随笔為你收集整理的【C语言重点难点精讲】C语言内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux shell 流程控制
- 下一篇: memcache运行机制(转)