<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C語言中的一切操作都是基於記憶體的
變數和陣列都是記憶體的別名
需求:程式執行的過程中,可能需要使用一些額外的記憶體空間
malloc 和 free 用於執行動態記憶體分配和釋放
void* malloc(size_t size);
void free(void* pointer);
注意事項
下面看一個記憶體漏失檢測模組的範例:
test.c:
#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; }
mleak.h:
#ifndef _MLEAK_H_ #define _MLEAK_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) { void* ret = malloc(n); /* 動態記憶體申請 */ if( ret != NULL ) { int i = 0; /* 遍歷全域性陣列,記錄此次操作 */ 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("Potential Memory Leak Info:n"); /* 遍歷全域性陣列,列印未釋放的空間記錄 */ for(i = 0; i < SIZE; i++) { if( g_record[i].pointer != NULL ) { printf("Address: %p, size:%d, Location: %s:%dn", g_record[i].pointer, g_record[i].size, g_record[i].file, g_record[i].line); } } }
輸出結果如下, 因為 MALLOC(100); 之後沒有進行釋放記憶體,所以被檢查出來了。
暫時不能用於工程開發,需要再開發才行。因為 malloc 往往在不同的執行緒中被呼叫,因此 malloc 函數必須要有互斥的操作。因為 static MItem g_record[SIZE]; 這個靜態全域性陣列是一種臨界區,必須被保護起來。
malloc(0);
將返回什麼?
下面看一段程式碼:
#include <stdio.h> #include <malloc.h> int main() { int* p = (int*) malloc(0); printf("p = %pn", p); free(p); return 0; }
輸出結果如下:
這說明 malloc(0) 是合法的,記憶體地址其實包含兩個概念,一個是記憶體的起始地址,一個是記憶體的長度。在平常我們可能會只注意記憶體的首地址,對於長度卻忽略了。malloc(0) 在這個程式中申請到的記憶體起始地址為 0x82c3008,長度為 0。
但是我們在程式裡不停寫 malloc(0),會造成記憶體漏失嗎?答案是肯定的,因為malloc 實際分配的記憶體可能會比請求的多,目前的作業系統一般都是 4 位元組對齊的,所以寫 malloc(0) 系統實際返回的位元組數也許就是 4 位元組。
malloc 的同胞兄弟
void* calloc(size_t num, size_t size);
void* realloc(void* pointer, size_t new_size);
calloc 的引數代表所返回記憶體的型別資訊
realloc 用於修改一個原先已經分配的記憶體塊大小
下面看一個 calloc 和 realloc 的使用範例:
#include <stdio.h> #include <malloc.h> #define SIZE 5 int main() { int i = 0; int* pI = (int*)malloc(SIZE * sizeof(int)); short* pS = (short*)calloc(SIZE, sizeof(short)); for(i = 0; i < SIZE; i++) { printf("pI[%d] = %d, pS[%d] = %dn", i, pI[i], i, pS[i]); } printf("Before: pI = %pn", pI); pI = (int*)realloc(pI, 2 * SIZE * sizeof(int)); printf("After: pI = %pn", pI); for(i = 0; i < 10; i++) { printf("pI[%d] = %dn", i, pI[i]); } free(pI); free(pS); return 0; }
輸出結果如下:
malloc 只負責申請空間,不負責初始化,這裡的 pI 指標儲存的值均為 0 只是巧合罷了,另外使用 realloc 重置之後,記憶體地址也會改變,pI 指標儲存的值也會改變,這裡都為 0 同樣也是巧合。
到此這篇關於C語言深入探索動態記憶體分配的使用的文章就介紹到這了,更多相關C語言 動態記憶體分配內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45