網(wǎng)站首頁 編程語言 正文
一、malloc函數(shù)和free函數(shù)
(1) 這個函數(shù)向內(nèi)存申請一塊連續(xù)可用的空間,并返回指向這塊空間的指針。
如果開辟成功,則返回一個指向開辟好空間的指針。
如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
返回值的類型是 void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時候使用者自己來決定。
如果參數(shù) size為0,malloc的行為是標準是未定義的,取決于編譯器。
void* malloc (size_t size);
(2) free函數(shù)
free函數(shù)用來釋放動態(tài)開辟的內(nèi)存。
如果參數(shù) ptr 指向的空間不是動態(tài)開辟的,那free函數(shù)的行為是未定義的。
如果參數(shù) ptr是NULL指針,則函數(shù)什么事都不做。
二、calloc函數(shù)與malloc函數(shù)的異同
(1)函數(shù)的功能是為 num 個大小為 size 的元素開辟一塊空間,并且把空間的每個字節(jié)初始化為0。
(2)與函數(shù) malloc 的區(qū)別只在于 calloc 會在返回地址之前把申請的空間的每個字節(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)特點
- 結構中的柔性數(shù)組成員前面必須至少一個其他成員。2. sizeof 返回的這種結構大小不包括柔性數(shù)組的內(nèi)存。
- 包含柔性數(shù)組成員的結構用malloc ()函數(shù)進行內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應該大于結構的大小,以適應 柔性數(shù)組的預期大小。
(2)使用優(yōu)勢
//代碼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è)務處理
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è)務處理
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的實現(xiàn)有兩個好處:
1. 方便內(nèi)存釋放
如果我們的代碼是在一個給別人用的函數(shù)中,你在里面做了二次內(nèi)存分配,并把整個結構體返回給用戶。用戶調(diào)用free可以釋放結構體,但是用戶并不知道這個結構體內(nèi)的成員也需要free,所以你不能指望用戶來發(fā)現(xiàn)這個事。所以,如果我們把結構體的內(nèi)存以及其成員要的內(nèi)存一次性分配好了,并返回給用戶一個結構體指針,用戶做一次free就可以把所有的內(nèi)存也給釋放掉。
2. 這樣有利于訪問速度.
連續(xù)的內(nèi)存有益于提高訪問速度,也有益于減少內(nèi)存碎片。
原文鏈接:https://blog.csdn.net/Onion_521257/article/details/105622852
相關推薦
- 2022-05-16 解析Sentry?Relay?二次開發(fā)調(diào)試_python
- 2022-07-15 VS2022?Git提交代碼的實現(xiàn)_C 語言
- 2022-05-12 Natapp(Ngrok) Windows下注冊為服務,開機啟動&后臺運行
- 2023-12-12 設置線程名稱(兩種方法)
- 2022-03-31 詳解C語言中的Static關鍵字_C 語言
- 2022-07-28 C++中操作符的前置與后置有什么區(qū)別_C 語言
- 2022-07-21 數(shù)據(jù)庫分組查詢--GROUP BY及排序
- 2022-06-17 Ruby信號處理詳解_ruby專題
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支