一文帶你搞懂C語言動(dòng)態(tài)內(nèi)存管理
一、malloc函數(shù)和free函數(shù)
(1) 這個(gè)函數(shù)向內(nèi)存申請(qǐng)一塊連續(xù)可用的空間,并返回指向這塊空間的指針。
如果開辟成功,則返回一個(gè)指向開辟好空間的指針。
如果開辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。
返回值的類型是 void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時(shí)候使用者自己來決定。
如果參數(shù) size為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。
void* malloc (size_t size);
(2) free函數(shù)
free函數(shù)用來釋放動(dòng)態(tài)開辟的內(nèi)存。
如果參數(shù) ptr 指向的空間不是動(dòng)態(tài)開辟的,那free函數(shù)的行為是未定義的。
如果參數(shù) ptr是NULL指針,則函數(shù)什么事都不做。
二、calloc函數(shù)與malloc函數(shù)的異同
(1)函數(shù)的功能是為 num 個(gè)大小為 size 的元素開辟一塊空間,并且把空間的每個(gè)字節(jié)初始化為0。
(2)與函數(shù) malloc 的區(qū)別只在于 calloc 會(huì)在返回地址之前把申請(qǐng)的空間的每個(gè)字節(jié)初始化為全0。
(3)例如
#include<stdio.h>
int main()
{
int* p = calloc(10, sizeof(int));
if (NULL != p)
{
//使用空間
}
free(p);
p = NULL;
return 0;
}

三、柔性數(shù)組
(1)特點(diǎn)
- 結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個(gè)其他成員。2. sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
- 包含柔性數(shù)組成員的結(jié)構(gòu)用malloc ()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng) 柔性數(shù)組的預(yù)期大小。
(2)使用優(yōu)勢(shì)
//代碼1
#include<stdio.h>
typedef struct st_type
{
int i;
int a[0];//柔性數(shù)組成員
}type_a;
void main()
{
printf("%d\n", sizeof(type_a));//輸出的是4
int i = 0;
type_a* p = (type_a*)malloc(sizeof(type_a) + 100 * sizeof(int));
//業(yè)務(wù)處理
p->i = 100;
for (i = 0; i < 100; i++)
{
p->a[i] = i;
}
free(p);
}
//代碼2
#include<stdio.h>
typedef struct st_type
{
int i;
int* p_a;
}type_a;
void main()
{
type_a* p = malloc(sizeof(type_a));
p->i = 100;
p->p_a = (int*)malloc(p->i * sizeof(int));
//業(yè)務(wù)處理
for (int i = 0; i < 100; i++)
{
p->p_a[i] = i;
}
//釋放空間
free(p->p_a);
p->p_a = NULL;
free(p);
p = NULL;
}
上述代碼1和代碼2都可以完成同樣的功能,但是方法1的實(shí)現(xiàn)有兩個(gè)好處:
1. 方便內(nèi)存釋放
如果我們的代碼是在一個(gè)給別人用的函數(shù)中,你在里面做了二次內(nèi)存分配,并把整個(gè)結(jié)構(gòu)體返回給用戶。用戶調(diào)用free可以釋放結(jié)構(gòu)體,但是用戶并不知道這個(gè)結(jié)構(gòu)體內(nèi)的成員也需要free,所以你不能指望用戶來發(fā)現(xiàn)這個(gè)事。所以,如果我們把結(jié)構(gòu)體的內(nèi)存以及其成員要的內(nèi)存一次性分配好了,并返回給用戶一個(gè)結(jié)構(gòu)體指針,用戶做一次free就可以把所有的內(nèi)存也給釋放掉。
2. 這樣有利于訪問速度.
連續(xù)的內(nèi)存有益于提高訪問速度,也有益于減少內(nèi)存碎片。
到此這篇關(guān)于一文帶你搞懂C語言動(dòng)態(tài)內(nèi)存管理的文章就介紹到這了,更多相關(guān)C語言內(nèi)存管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入了解C語言的動(dòng)態(tài)內(nèi)存管理
- 詳解C語言中動(dòng)態(tài)內(nèi)存管理及柔性數(shù)組的使用
- C語言動(dòng)態(tài)內(nèi)存的分配最全面分析
- 詳解C語言中的動(dòng)態(tài)內(nèi)存管理
- C語言動(dòng)態(tài)內(nèi)存分配圖文講解
- 使用c語言輕松實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存管
- 一文帶你了解C語言中的動(dòng)態(tài)內(nèi)存管理函數(shù)
- C語言動(dòng)態(tài)內(nèi)存管理的原理及實(shí)現(xiàn)方法
- 詳解C語言中動(dòng)態(tài)內(nèi)存管理
- C語言中常見的六種動(dòng)態(tài)內(nèi)存錯(cuò)誤總結(jié)
- 一文解析C語言中動(dòng)態(tài)內(nèi)存管理
- C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)示例
相關(guān)文章
使用C++模擬實(shí)現(xiàn)2024春晚劉謙魔術(shù)
劉謙在2024年春晚上的撕牌魔術(shù)的數(shù)學(xué)原理非常簡(jiǎn)單,所以這篇文章主要為大家詳細(xì)介紹了如何使用C++模擬實(shí)現(xiàn)這一魔術(shù)效果,感興趣的可以了解下2024-02-02
opencv實(shí)現(xiàn)視場(chǎng)轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)視場(chǎng)轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
使用C語言生成圖片的base64編碼的代碼實(shí)現(xiàn)
Base64編碼是一種廣泛使用的編碼方案,將任意二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可打印的ASCII字符字符串,在實(shí)際應(yīng)用中,Base64編碼常見于電子郵件附件、數(shù)據(jù)庫(kù)中存儲(chǔ)非文本數(shù)據(jù)等多種場(chǎng)景,本文將給大家介紹使用C語言生成圖片的base64編碼的代碼實(shí)現(xiàn),需要的朋友可以參考下2024-08-08

