日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【C语言重点难点精讲】C语言内存管理

發布時間:2025/3/15 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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個字節后發現空間不夠,然后重新調整

int main() { int* p = (int*)malloc(20);//20字節數據 if (p == NULL) {printf("%s\n", strerror(errno)); } else {for (int i = 0; i < 5; i++) {p[i] = i;} }int*p1 = realloc(p, 40);//將空間調整為40字節,并返回調整后的地址 for (int j = 0; j < 10; j++) {printf("%d ", *(p + j)); } free(p1); p = NULL; return 0; }

需要注意:realloc申請空間有兩種方式

在堆區重新調整空間必然會遇到兩種情況,第一種原有的空間后面有足夠大的空間,那么申請時相當于就在原有空間后面補上缺的部分,這樣其返回的仍然是原來空間的地址;第二種原有的空間后面不夠大,realloc會重新找一片能完整存放的區域,然后把之前的內容照搬賦值過來,并釋放先前空間

二:進程地址空間

C/C++程序的地址空間排布如下

用一個例子說明如下

#include <stdio.h> #include <stdlib.h>int gobal_val=100;//全局變量已經初始化 int gobal_unval;//全局變量未初始化 int main(int argc,char* argv[],char* env[]) {printf("main函數處于代碼段,地址為:%p,十進制為:%d\n",main,main);printf("\n");printf("全局變量gobal_val,地址為:%p,十進制為:%d\n",&gobal_val,&gobal_val);printf("\n");printf("全局變量未初始化gobal_unval,地址為:%p,十進制為:%d\n",&gobal_unval,&gobal_unval);printf("\n");char* mem=(char*)malloc(10);printf("mem開辟的堆空間,mem是堆的起始地址,是%p,十進制為:%d\n",mem,mem);printf("\n"); printf("mem是指針變量,指針變量在棧上開采,其地址為%p,十進制為:%d\n",&mem,&mem);printf("\n"); printf("命令行參數起始地址:%p,十進制為:%d\n",argv[0],argv[0]);printf("\n");printf("命令行參數結束地址:%p,十進制為:%d\n",argv[argc-1],argv[argc-1]);printf("\n");printf("第一個環境變量的地址:%p,十進制為:%d\n",env[0],env[0]);printf("\n"); }

三:常見內存錯誤

1:對空指針進行解引用

2:越界訪問

動態內存指的是動態指的是在需求改變時我們可以隨時更改內存,但是它畢竟每次申請出來的也是一個確定的空間,所以你的指針不能跑到空間外面去

3:對非動態內存進行free

4:使用free釋放一塊動態開辟內存的一部分

free釋放的是開辟的空間的首位置,使用時指針不能變化,不然就非法釋放別的內存了

5:對同一塊動態內存多次釋放

6:內促泄漏
如果開辟的內存忘記釋放(當然是工程量大的情況),極易造成內存泄漏,而排查內存泄漏是一項很麻煩的事

總結

以上是生活随笔為你收集整理的【C语言重点难点精讲】C语言内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。