亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言 動態內存分配的詳解及實例

2020-01-26 14:25:23
字體:
來源:轉載
供稿:網友

1. 動態內存分配的意義

(1)C 語言中的一切操作都是基于內存的。

(2)變量和數組都是內存的別名。

    ①內存分配由編譯器在編譯期間決定

    ②定義數組的時候必須指定數組長度

    ③數組長度是在編譯期就必須確定的

(3)但是程序運行的過程中,可能需要使用一些額外的內存空間

2. malloc 和 free 函數

(1)malloc 和 free 用于執行動態內存分配的釋放

(2)malloc 所分配的是一塊連續的內存

(3)malloc 以字節為單位,并且返回值不帶任何的類型信息:void* malloc(size_t size);

(4)free 用于將動態內存歸還系統:void free(void* pointer);

(5)_msize(void* pointer)可以獲取 malloc 出來的內存空間大小

3. 使用 malloc 和 free 需要注意的地方

(1)malloc 和 free 是庫函數,而不是系統調用

(2)malloc 實際分配的內存可能有會比請求的多,但不能依賴于不同平臺下的 malloc 行為。

(3)當請求的動態內存無法滿足時,malloc 返回 NULL

(4)當 free 的參數為 NULL 時,函數直接返回

malloc(0)返回什么?

#include <stdio.h>#include <malloc.h>int main(){  int i=10;  int* p= NULL;  for(i=0;i<100;i++)  {    //注意,malloc(0)會返回一個有效的內存地址,大小為1    //但我們不能依賴編譯器的這種行為來使用這個字節的空間!    p = (int*)malloc(i);    printf("%d ",_msize(p));//返回malloc出來的內存空間大小    free(p);  }  return 0;}

內存泄漏檢測模塊

mleak.h

#ifndef _MLEAK_H_#define _MLEAK_H_#include <stdio.h>#include <malloc.h>#define MALLOC(n) mallocEx(n, __FILE__, __LINE__)#define FREE(p) freeEx(p)void* mallocEx(size_t n, const char* file, const line);void freeEx(void* p);void PRINT_LEAK_INFO();#endif

mleak.c

復制代碼

#include "mleak.h"#define SIZE 256//動態內存申請參數結構體typedef struct{  void* pointer;//申請到的內存地址  int size;   //內存塊大小  const char* file; //文件名  int line;     //文件行號}MItem;static MItem g_record[SIZE]; //記錄每個動態內存申請的操作void* mallocEx(size_t n, const char* file, const line){  int i = 0;  void* ret = malloc(n);//動態內存申請    if(ret != NULL)  {    //申請成功,則記錄下來        //遍歷全局數組,記錄此次操作    for(i = 0; i< SIZE; i++)    {      //查找位置      if(g_record[i].pointer == NULL)      {        g_record[i].pointer = ret;        g_record[i].size = n;        g_record[i].file = file;        g_record[i].line = line;        break;      }    }  }    return ret;}void freeEx(void* p){  if(p != NULL)  {    int i = 0;    //遍歷全局數組,釋放內存空間,并清除操作記錄    for(i = 0; i< SIZE; i++)    {      if(g_record[i].pointer == p)      {        g_record[i].pointer = NULL;        g_record[i].size = 0;        g_record[i].file = NULL;        g_record[i].line = 0;                free(p);        break;      }    }  }}void PRINT_LEAK_INFO(){  int i = 0;  printf("Potenital Memory Leak Info:/n");  //遍歷全局數組,打印未釋放的空間的申請記錄  for(i = 0; i< SIZE; i++)  {    //查找位置    if(g_record[i].pointer != NULL)    {       printf("Address:%p, size:%d, Location:%s:%d/n",           g_record[i].pointer,           g_record[i].size,           g_record[i].file,           g_record[i].line);     }   }}

testc.

#include <stdio.h>#include "mleak.h"void f(){  //沒釋放,會造成內存泄漏!  MALLOC(100); }int main(){  int* p = (int*)MALLOC(3 * sizeof(int));  f();    p[0] = 1;  p[1] = 2;  p[2] = 3;  FREE(p);  PRINT_LEAK_INFO();    return 0;}/*輸出結果:E:/Study>gcc test.c mleak.cE:/Study>a.exePotenital Memory Leak Info:Address:00602ED8, size:100, Location:38-1.c:7*/

4. calloc 和 realloc 函數

(1)malloc 的同胞兄弟:

    void* calloc(size_t num, size_t size);

    void* realloc(void* pointer,size_t new_size);

(2)calloc 參數表示要返回 num 個某種類型(如 sizeof(int))大小的內存空間。calloc 能以類型大小為單位申請內存并初始化為 0.

(3)realloc 用于修改一個原先己經分配的內存塊大小。當第一個參數 pointer 為 NUL 時,等價于 malloc。

calloc 和 realloc 的使用

#include <stdio.h>#include <malloc.h>#define SIZE  5int main(){  int i = 0;  int* pI = (int*)malloc(SIZE * sizeof(int)); //malloc內存沒有初始化  short* pS = (short*)calloc(SIZE, sizeof(short));//內存初始化為0  for (i = 0; i < SIZE;i++)  {    printf("pI[%d] = %d, pS[%d] = %d/n", i, pI[i], i, pS[i]);  }  printf("Before: pI = %p/n", pI); //重置內存大小之前的pI指針  pI = (int*)realloc(pI, 2 * SIZE * sizeof(int)); //內存未初始化的  printf("After: pI = %p/n", pI);  for (i = 0; i < 10;i++)  {    printf("pI[%d] = %d/n", i, pI[i]);   }  free(pI);  free(pS);  return 0;}

通過此文希望大家對C語言的動態內存分配了解掌握,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文av在线| 亚洲精品自拍偷拍| 亚洲视频在线观看| 国产欧美日韩专区发布| 成人a视频在线观看| 亚洲精品美女在线| 社区色欧美激情 | 国产精品日韩精品| 欧美日韩午夜激情| 国自产精品手机在线观看视频| 精品久久久久久国产91| 亚洲一区av在线播放| 国产日韩在线一区| 亚洲在线免费视频| 性欧美xxxx视频在线观看| xxx一区二区| 久久久999精品视频| 午夜精品蜜臀一区二区三区免费| 美日韩精品视频免费看| 欧美福利视频在线| 国产精品久久9| 亚洲人成电影网站色xx| 国产欧美韩国高清| 欧美激情久久久久久| 欧美激情视频在线观看| 成人免费福利视频| 欧美电影免费观看电视剧大全| 日韩免费在线播放| 国产欧美精品一区二区三区介绍| 亚洲a级在线观看| 热久久99这里有精品| 伊人久久久久久久久久| 91精品久久久久久久久不口人| 韩国国内大量揄拍精品视频| 国产精品视频免费在线观看| 国产成人小视频在线观看| 亚洲男女自偷自拍图片另类| 国产精品国产自产拍高清av水多| 国产精品久久久久福利| 97视频在线看| 国产精品极品在线| 国产成人精品免高潮费视频| 亚洲成人免费网站| 国产精品美女久久| 国产精选久久久久久| 亚洲欧美中文日韩在线v日本| 亚洲自拍偷拍一区| 日韩av影视在线| 日韩视频免费在线观看| 亚洲欧洲第一视频| 久久久精品视频在线观看| 国语自产偷拍精品视频偷| 亚洲色图五月天| 久久国产精品偷| 精品国产一区二区三区久久| 麻豆国产va免费精品高清在线| 成人黄色大片在线免费观看| 国产精品成人aaaaa网站| 亚洲成av人影院在线观看| 久久91精品国产91久久久| 成人在线一区二区| 国产性色av一区二区| 亚洲www在线| 欧美性少妇18aaaa视频| 久久久中精品2020中文| 91国内精品久久| 久久久精品在线观看| 亚洲欧美另类中文字幕| 91免费看视频.| 中文字幕精品视频| 亚洲欧美日韩久久久久久| 欧美性猛交xxxx| 日韩大陆欧美高清视频区| 亚洲人成在线免费观看| 久久九九精品99国产精品| 久久久国产精品免费| 久久中文字幕在线| 亚洲欧美国产高清va在线播| 社区色欧美激情 | 国产日韩欧美电影在线观看| 国产日韩欧美中文在线播放| 日韩国产一区三区| 2019av中文字幕| 国产亚洲精品美女久久久久| 久久久久久91香蕉国产| 久久久精品免费| 欧美一区深夜视频| 亚洲精品资源美女情侣酒店| 亚洲激情中文字幕| 日韩欧美成人免费视频| 97久久精品视频| 欧美黄色片免费观看| 中文字幕亚洲图片| 69影院欧美专区视频| 91在线视频免费| 欧美激情综合亚洲一二区| 亚洲色图狂野欧美| 亚洲精品中文字幕女同| 亚洲精品国产福利| 北条麻妃久久精品| 久久精品久久久久久国产 免费| 久久久精品免费视频| 久久精品影视伊人网| 亚洲一区二区三区乱码aⅴ| 亚洲free性xxxx护士白浆| 另类视频在线观看| 国产亚洲精品久久久| 久久99亚洲热视| 美女久久久久久久久久久| 亚洲缚视频在线观看| 色www亚洲国产张柏芝| 中文字幕日韩有码| 欧美激情中文网| 成人免费视频在线观看超级碰| 亚洲影影院av| 国产综合在线视频| 一区三区二区视频| 久久久国产视频| 伊人一区二区三区久久精品| 国产欧美一区二区三区四区| 精品国产31久久久久久| 国产精品电影在线观看| 国产网站欧美日韩免费精品在线观看| 亚洲男人av在线| 性色av一区二区三区红粉影视| 欧美劲爆第一页| 日韩天堂在线视频| 一本一本久久a久久精品牛牛影视| 日韩av资源在线播放| 成人深夜直播免费观看| 亚洲精品视频网上网址在线观看| 欧美精品18videos性欧美| 不卡av电影院| 国产精品精品久久久| 视频在线观看一区二区| 久久精品国产亚洲7777| 九九视频这里只有精品| 欧美久久精品一级黑人c片| 日韩在线视频免费观看| 国产亚洲精品久久久久久牛牛| 97在线免费观看| 51视频国产精品一区二区| 欧美与欧洲交xxxx免费观看| 国产精品久久久久久av| 国产在线999| 亚洲第一区中文99精品| 亚洲天堂av图片| 国产欧美精品xxxx另类| 日韩免费在线观看视频| 成人性生交xxxxx网站| 国产噜噜噜噜噜久久久久久久久| 青青久久av北条麻妃海外网| 欧美一级淫片videoshd| 在线观看成人黄色| 日韩精品一区二区三区第95| 国产中文字幕亚洲| 亚洲精品91美女久久久久久久| 国产v综合v亚洲欧美久久| 精品国产一区二区三区在线观看| 亚洲第一精品夜夜躁人人爽| 日韩av免费在线看| 久久精品成人动漫| 欧美日韩亚洲高清| 色噜噜狠狠狠综合曰曰曰88av|