
為什么C語言要動態分配內存的意義?
1.C語言中的一切操作都是基于內存的
2.變量和數組都是內存的別名
---內存分配由編譯器在編譯期間決定的
---定義數組的時候必須指定數組長度
---數組長度是在編譯期就必須確定的
需求:程序運行的過程中,可能需要使用一些額外的內存空間
實際使用就是malloc和free函數
用于內存的分配和釋放
1.malloc所分配的是一塊連續的內存
2.malloc一字節為單位,并且不帶任何的類型信息
3.free用于將動態內存歸還系統
void* malloc(size_t size)
void free(void* pointer)
注意:
1.malloc和free是庫函數,不是系統調用
2.malloc實際分配的內存可能會比請求的多---有些編譯器分配時是以4字節為單元的
3.不能依賴于不同平臺的下的malloc
4.當請求的動態內存無法滿足時malloc返回的是NULL
5.當free的參數為NULL時,函數直接返回
思考一個問題:malloc*(0);返回值是什么?*(這也是一個面試題)
#include
引出一個問題,這里不停的malloc,但是不free會造成內存泄露嗎?
答案是會的,因為現代編譯器一般是分配的4個整數字節,也就是申請的是0。但是實際分配的可能是4
解決的方式是:高級語言的(Java,.net.python等都是有內存回收功能的)
不過嵌入式基本都是使用C語言的(我做無人機的時候使用的是c++),那就得解決
下邊是一個實際操作---內存泄露檢測模塊
gcc 38-1.c mleak.c (編譯需要的所有文件)
#include
怎么實現內存檢測的呢?
mleak.c函數
#include
mleak.h
#ifndef _MLEAK_H_
新概念
calloc和realloc
1.malloc的同胞兄弟
void* calloc(size_t num,size_t size);
void* realloc(void* pointer,size_t new_size);
2.calloc的參數代表所返回的內存的類型信息
---calloc會將=返回的內存初始化為0
3.realloc用于修改一個原先已經分配好的內存塊的大小
---在使用realloc之后應該使用期返回值
---當pointer的第一個參數時NULL時,等價于malloc
實例使用:
#include
小結:
1.動態分配內存是C語言的強大功能
2.程序能夠在需要的時候有機會使用更多的內存
3.malloc單純的從系統中申請固定字節大小的內存
4.calloc能以類型大小為單位申請內存并初始化為0
5.relloc用于重置內存大小
說明
1.該文檔僅供個人學習使用,版權所有,禁止商用。
2.本文由我一個人編輯并整理,難免存在一些錯誤。
3.為了方便大家平時公交、地鐵、外出辦事也能用手機隨時隨地查看該教程,該教程同步更新于微信公眾號『Allen5G』。
我的微信公眾號(ID:Allen5G)主要分享軟件工程師進階(嵌入式,Linux,C/C++,python,英語),程序員職業發展,如果想查看更多內容,可以關注我的微信公眾號『Allen5G』