【C語言】內存操作篇---動態內存管理----malloc,realloc,calloc和free的用法【圖文詳解】

歡迎來CILMY23的博客喔,本篇為【C語言】內存操作篇---動態內存管理----malloc,realloc,calloc和free的用法【圖文詳解】,感謝觀看,支持的可以給個一鍵三連,點贊關注+收藏。

前言

?在學完結構體后(結構體1:http://t.csdnimg.cn/ZkBHj結構體2:http://t.csdnimg.cn/rmAwJ)我們要進入新篇章了,內存操作中最關鍵的一節---動態內存管理,本篇博客將了解malloc,realloc,calloc和free的用法。

目錄

一、為什么會有動態內存管理?

二、malloc和free

malloc的介紹和使用??

空間回收?

free的介紹和使用

三、realloc

realloc的介紹和使用?

四、calloc?

calloc的介紹和使用?


一、為什么會有動態內存管理?

?在過去我們向內存中申請空間有兩種方式,一是創建變量,二是創建數組

#include<stdio.h>int main()
{int C = 23;//申請四個字節空間char c = 'C';//申請1個字節空間char CI[10] = "CILMY23";//申請10個字節空間return 0;
}

但是上述的開辟空間的方式有兩個特點:
? ? ?空間開辟大小是固定的。
? ? ?數組在聲明的時候,必須指定數組的長度,數組空間一旦確定了大小不能調整
我們申請的空間都很固定,沒法靈活調整,但是對于空間的需求,不僅僅是上述的情況。有時候我們需要的空間大小在程序運行的時候才能知道,那數組和變量的編譯時開辟空間的方式就不能滿足了。
C語言引入了動態內存開辟,讓程序員自己可以申請和釋放空間,就比較靈活了。?

二、malloc和free

malloc可以在cplusplus網站查詢:malloc - C++ Reference (cplusplus.com)??

?malloc函數原型如下:

void* malloc (size_t size);

?malloc的函數介紹如下:

malloc 的功能如下:

malloc的介紹和使用??

malloc函數是頭文件stdlib中的,malloc函數是用來向內存申請空間的(在堆區申請),在函數原型中我們可以看到有一個形參size_t size,根據Allocates a block of?size?bytes of memory, returning a pointer to the beginning of the block,我們知道這個形參是計算空間大小后得出的結果,比如申請40個字節空間,size就等于40.那它最后會返回一個指針,指向這個空間的起始位置,那返回類型是void*,因為我并不知道這段空間會干什么,所以返回void*(不懂可以看http://t.csdnimg.cn/dshm8),當malloc失敗后,會返回一個NULL。

使用如下:

#include<stdio.h>
#include<stdlib.h>int main()
{// 向內存空間申請40個字節//將void*轉換成int*類型將其存入指針變量pint* p = (int *)malloc(10 * sizeof(int));int i = 0;//將i存入開辟的空間for (i = 0; i < 10; i++){*(p + i) = i;}//將空間中的數值打印for (i = 0; i < 10; i++){printf("%d ", *(p + i));}
}

結果如下:

?

?圖解如下:

?那如果我們申請失敗了呢?那我們就可以用perror來直接打印錯誤信息。

if (*p == NULL)
{perror("malloc");
}

空間回收?

malloc是在堆區申請空間的,malloc的空間回收有兩種方法,一是free回收,二是程序結束的時候,由操作系統回收?我們這里主要講free回收,首先回顧一下內存的區域,主要由堆區棧區和靜態區構成,堆區是動態分配區,像malloc這些,棧區是臨時的參數,局部變量和形式參數,靜態區主要是全局變量和靜態變量。

?
?????

free的介紹和使用

free函數的原型如下:

void free (void* ptr);

free函數介紹如下:

?free的功能和使用案例如下:

free函數是用來釋放動態開辟出來的空間,給到地址就能釋放地址所指向的位置?

free的使用:

#include<stdio.h>
#include<stdlib.h>int main()
{// 向內存空間申請40個字節//將void*轉換成int*類型將其存入指針變量pint* p = (int *)malloc(10 * sizeof(int));if (*p == NULL){perror("malloc");}int i = 0;//將i存入開辟的空間for (i = 0; i < 10; i++){*(p + i) = i;}//將空間中的數值打印for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);p = NULL;
}

我們使用free(),因為我們將p所指向的空間釋放了,那p就成了野指針,我們就需要處理野指針,所以將p置空。?

總結:

malloc如果開辟成功,則返回?個指向開辟好空間的指針。
? ? ?如果開辟失敗,則返回?個NULL 指針,因此malloc的返回值?定要做檢查。
? ? ?返回值的類型是void* ,所以malloc函數并不知道開辟空間的類型,具體在使用的時候使用者自己來決定。
? ? ?如果參數size為0,malloc的行為是標準是未定義的,取決于編譯器。

free函數只能用來釋放動態開辟的內存。
? 如果參數 ptr 指向的空間不是動態開辟的,那free函數的行為是未定義的。
? 如果參數 ptr 是NULL指針,則函數什么事都不做。

三、realloc

?

?realloc函數可以在cplusplus網站查詢:realloc - C++ Reference (cplusplus.com)

realloc的原型如下:

void* realloc (void* ptr, size_t size);

realloc的函數介紹如下:??

realloc的功能和使用案例如下:?

realloc的介紹和使用?

?realloc的參數有void* ptr, size_t size,size就是要調整后的空間大小,ptr則是要調整的空間起始地址。realloc 的調整分兩種情況,一種是原地擴,也就是后面的空間足夠,如下圖所示,未分配的空間加已分配的橙色空間剛好夠size,或者小于size,則realloc原地擴

第二種情況是未分配的黑色空間加已分配的橙色空間,超過size后的字節,那realloc會到新的一塊未分配區域重新開辟一塊空間,來分配原先的字節,并將原來的地址做拷貝,最后返回新的空間地址,并且舊空間會自動釋放掉。

realloc的使用:

#include<stdio.h>
#include<stdlib.h>int main()
{int* p = (int*)malloc(10 * sizeof(int));int i = 0;for (i = 0; i < 10; i++){*(p + i) = i;}for (i = 0; i < 10; i++){printf("%d ", *(p + i));}//調整申請的堆上內存int* tmp = (int*)realloc(p, 40);if (tmp != NULL){p = tmp;tmp = NULL;}else{perror("realloc");}free(p);p = NULL;return 0;
}

總結:

? ptr 是要調整的內存地址
? size 調整之后新大小
? 返回值為調整之后的內存起始位置。
? 這個函數調整原內存空間大小的基礎上,還會將原來內存中的數據移動到新的空間。
? ? ?realloc在調整內存空間的是存在兩種情況:
? 情況1:原有空間之后有足夠大的空間
? 情況2:原有空間之后沒有足夠大的空間

四、calloc?

calloc函數可以在cplusplus網站查詢:calloc - C++ Reference (cplusplus.com)?

calloc的原型如下:

void* calloc (size_t num, size_t size);

calloc的函數介紹如下:?

?

calloc的功能和使用案例如下:?

?

calloc的介紹和使用?

calloc的參數是兩個,一個是num,一個是大小size,其中一個給數量,一個給大小。calloc和malloc函數最大區別就是,calloc會賦一個初值,每個初值都是0.?使用和malloc是差不多的

?

使用如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{int* p = (int*)calloc(10 ,sizeof(int) );int i = 0;for (i = 0; i < 10; i++){printf("%d ", p[i]);}printf("\n");for (i = 0; i < 10; i++){*(p + i) = i;}for (i = 0; i < 10; i++){printf("%d ", p[i]);}free(p);p = NULL;
}

?結果如下:

?

?如果我們只是想開辟空間,我們只需要用malloc,而calloc是把開辟出來的空間賦了一個初值。

總結:

?? 函數的功能是為num 個大小為size的元素開辟?塊空間,并且把空間的每個字節初始化為0
? ?與函數malloc 的區別只在于calloc會在返回地址之前把申請的空間的每個字節初始化為全 0

感謝各位同伴的支持,本期動態內存管理篇就講解到這啦,如果你覺得寫的不錯的話,可以給個一鍵三連,點贊關注+收藏,若有不足,歡迎各位在評論區討論。????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717080.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營|day46

第九章 動態規劃 139.單詞拆分代碼隨想錄文章詳解總結 139.單詞拆分 dp[i]表示字符串的前i個字符能被拆分為字典中的單詞 排列問題&#xff1a;外循環背包&#xff0c;內循環物品 字符串能被字典拆分&#xff0c;將當前字符串s[:i]拆分為s[:j]和s[j:i]&#xff0c;意味著s[:j]…

2174. 費用流(費用流,模板題)

活動 - AcWing 給定一個包含 n 個點 m 條邊的有向圖&#xff0c;并給定每條邊的容量和費用&#xff0c;邊的容量非負。 圖中可能存在重邊和自環&#xff0c;保證費用不會存在負環。 求從 S 到 T 的最大流&#xff0c;以及在流量最大時的最小費用。 輸入格式 第一行包含四個…

探索設計模式的魅力:備忘錄模式揭秘-實現時光回溯、一鍵還原、后悔藥、歷史的守護者和穿越時空隧道

?&#x1f308; 個人主頁&#xff1a;danci_ &#x1f525; 系列專欄&#xff1a;《設計模式》 &#x1f4aa;&#x1f3fb; 制定明確可量化的目標&#xff0c;并且堅持默默的做事。 備忘錄模式揭秘-實現時光回溯、一鍵還原、后悔藥和穿越時空隧道 文章目錄 一、案例場景&…

數據結構作業復盤1:字符串疑難雜癥小匯總(字符串賦值,指針數組...)

學校里開始上數據結構了&#xff0c;一開始是從C語言一些相關的基礎開始講起。第一次作業主要是字符串相關的基礎知識以及編程題目。先做了一部分&#xff0c;整理了一下一些字符串隱含的知識和一些易誤易混的概念&#xff0c;算是給自己的一個復盤和歸納。 strcpy函數相關 首…

System Verilog學習筆記(十五)——包的使用

System Verilog學習筆記&#xff08;十五&#xff09;——包的使用 為了使得可以在多個模塊或者類之間共享用戶定義類型&#xff0c;SV添加了包&#xff08;package&#xff09;。用戶自定義的類型例如類、方法、變量、結構體、枚舉類型等都可以在package…endpackage中定義。…

sc-MAVE

Deep-joint-learning analysis model of single cell transcriptome and open chromatin accessibility data單細胞轉錄組和開放染色質可及性數據的深度聯合學習分析模型 在同一個細胞中同時分析轉錄組和染色質可及性信息為了解細胞狀態提供了前所未有的解決方案。然而&#x…

數據結構——基本概念與術語2,抽象數據類型的表示與實現

目錄 1.數據類型 2.抽象數據類型 1.抽象數據類型的形式定義 基本操作定義格式說明 2.抽象數據類型定義舉例&#xff1a;circle的定義 3.抽象數據類型定義舉例&#xff1a;復數的定義 概念小結&#xff1a; 3.抽象數據類型的表示與實現 1.數據類型 2.抽象數據類型 比如一…

Stable Diffusion webui 常用啟動參數

automatic1111 &#xff08;stable diffusion webui開源項目&#xff09; --listen 開啟遠程訪問&#xff0c;局域網內主機可通過ip地址訪問SD webui主機 --share 開啟互聯網訪問&#xff0c;任何主機都可訪問主機&#xff0c;啟動后會在啟動文本上顯示訪問鏈接 --port 通常…

游戲框架搭建

使用框架的目標&#xff1a;低耦合&#xff0c;高內聚&#xff0c;表現和數據分離 耦合&#xff1a;對象&#xff0c;類的雙向引用&#xff0c;循環引用 內聚&#xff1a;相同類型的代碼放在一起 表現和數據分離&#xff1a;需要共享的數據放在Model里 對象之間的交互一般有三…

跨平臺指南:在 Windows 和 Linux 上安裝 OpenSSL 的完整流程

Windows安裝 一&#xff1a;找到安裝包&#xff0c;雙擊即可 https://gitee.com/wake-up-again/installation-package.git 二&#xff1a;按照提示&#xff0c;一步一步來&#xff0c;就可以啦 三&#xff1a;此界面意思是&#xff0c;是否想向創作者捐款&#xff0c;自己視情…

2024最新搭建Mybatis配置教程【超詳細】

為什么要學習mybatis 首先要弄清楚什么是mybatis&#xff1f;我們為什么要學mybatis 學習MyBatis可以幫助開發人員更高效地進行數據庫操作&#xff0c;提高開發效率&#xff0c;并且可以使得應用程序更具可維護性和性能優勢。 我們知道Java程序操作數據庫是通過jdbc與數據庫進…

藍橋杯——矩形拼接

矩形拼接 題目分析 對于一個矩形而言&#xff0c;我可以把它橫著放&#xff0c;而可以把它豎著放&#xff0c;比如下圖&#xff0c; 3個矩形的拼接情況可以通過在紙上畫圖模擬出來&#xff0c;情況有以下三種 ? 圖1 圖3是4條邊&#xff0c;即四邊形。觀察一下什么時候會是四…

IO(Linux)

文件系統 前言1. 回顧關于C文件部分函數2. 一些文件知識的共識3. 相對路徑4. fwrite中的\0 一、文件描述符fd1. 概念2. 系統調用① open 和 close② write③ read 和 lseek 3. 缺省打開的fd 二、重定向1. 原理2. 系統調用dup23. stdout和stderr的區別4. 進程替換和原來進程文件…

【計算機考研】408學到什么程度才能考130?

408考130要比考研數學考130難的多 我想大部分考過408的考生都是這么認為的。408的難點在于他涉及的范圍太廣了&#xff0c;首先如果你要備考408&#xff0c;你要準備四門課程&#xff0c;分別是數據結構&#xff0c;計算機組成原理&#xff0c;操作系統和計算機網絡。 這四門…

kafka學習筆記四(面試題)

[Kafka 常見面試題]如何保證消息的不重復不丟失-阿里云開發者社區 (aliyun.com) 18道kafka高頻面試題哪些你還不會&#xff1f;&#xff08;含答案和思維導圖&#xff09;-阿里云開發者社區 (aliyun.com) Leader Epoch機制解決的是數據丟失或不一致的問題&#xff0c;見下文&…

報錯解決:av.codec.codec.UnknownCodecError: libx264

1. 錯誤信息 今天在使用Pytorch.io和PyAV包的時候出現了這個錯誤&#xff0c;完整的錯誤信息如下所示&#xff1a; ...envs\tf2_py38\lib\site-packages\torchvision\io\video.py", line 92, in write_videostream container.add_stream(video_codec, ratefps)File &qu…

企業計算機服務器中了360勒索病毒如何解密,360后綴勒索病毒處理流程

對于眾多的企業來說&#xff0c;企業的數據是企業發展的核心&#xff0c;越來越多的企業開始注重企業的數據安全問題&#xff0c;但隨著網絡技術的不斷發展與應用&#xff0c;網絡黑客的攻擊加密手段也在不斷升級。近期&#xff0c;云天數據恢復中心接到多家企業的求助&#xf…

設計模式—命令模式:探索【命令模式】的奧秘與應用實踐!

命令模式 命令模式是一種行為設計模式&#xff0c;它的主要目的是將請求封裝成一個對象&#xff0c;從而使得請求的發送者和接收者之間進行解耦。 在命令模式中&#xff0c;命令被封裝為一個對象&#xff0c;包含了需要執行的操作以及執行這些操作所需的所有參數。 命令的發送者…

【藍橋杯】2023省賽真題詳解(更新中)

&#x1f40f;小憐憐的簡介&#xff1a; &#x1f496;博客主頁&#xff1a;浣熊小憐憐 &#x1f680;年齡&#xff1a;23 大三在讀 &#x1f4aa;愛好&#xff1a;干飯&#xff0c;運動&#xff0c;碼代碼&#xff0c;看書&#xff0c;音樂 &#x1f389;歡迎關注&#x1f50d…

Vue3 v-for循環獲取不到圖片路徑問題

解決辦法 <span>{{item.title}}</span> 通過本地靜態文件獲取img的地址即可展示圖片 url:"/src/assets/comImgs/txt1.png",