C語言---動態內存管理

為什么要有動態內存分配

? ? ? ? 我們在學習動態內存管理之前,一直都是通過開辟變量,或者是開辟數組的方式來在內存的棧區開辟空間的,但是這樣的開辟方式有局限性,因為一旦開辟之后,它們的大小就無法改變,就缺少了很多的靈活性,但是動態內存管理就可以幫助我們解決這個問題,它是在堆區開辟空間的,并且它所開辟的空間是可大可小的。

動態內存開辟四大函數

????????其實想要動態開辟內存空間非常的簡單,我們只需要學會內存開辟四大函數就可以了。

????????malloc和free

????????malloc函數就是用來在內存的堆區開辟空間的,它的函數定義如下。

? ?void* malloc (size_t size);

? ?函數的形參表示所要開辟空間的字節大小,你想要開辟幾個字節的空間,就給形參什么值,malloc函數是在堆區開辟的一塊連續的空間,一旦開辟了空間,我們想要找到這塊空間,就勢必要只要它的起始地址值,而malloc函數的返回值就是這個作用,它返回的是開辟空間的起始地址,那為什么是void*類型的指針呢?原因就是我在開辟的時候,我也不知道要往這塊空間里邊存放什么類型的數據,或者說什么類型的數據都可以存放在我這塊空間里邊,所以一開始就給它返回的是void*類型的指針。還有一個值得注意的點就是malloc開辟空間如果失敗的話,就會返回NULL值,所以我們需要對返回值進行判斷。

????????malloc函數的使用舉例

#include<stdio.h>
#include<stdlib.h>//四大內存開辟函數都需要包含這個頭文件int main()
{//假設現在我想要開辟40個字節的空間,并且像里邊存放整型數據int* pi = (int*)malloc(40);//判斷是否開辟成功//為NULL就代表開辟空間失敗,perror打印開辟失敗的原因//返回非0的值,C語言里邊返回非0的值表示異常結束if (pi == NULL){perror("malloc");return 1;}//開辟成功,可以向這塊空間里邊存值for (int i = 0; i < 10; i++){*(pi + i) = i + 1;//存入1~10的值}//打印for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}return 0;
}

? ? ? ? 由上邊的代碼跟運行結果來看,好像似乎并沒有什么問題,但malloc畢竟是動態開辟的空間,開辟了空間難道就不用回收的嗎?答案是要回收的,上邊的代碼好像并沒有回收,那怎么也可以運行呢,原因是當程序結束的時候,操作系統會自動幫你回收,不過如果日后的代碼過長,或者是程序是一個7*24小時不停歇的運轉的話,如果我們不主動回收,就會出現內存泄露的問題,所以如果這塊動態開辟的內存你不再想要使用的時候,就請主動回收掉,free函數就是用來主動回收的。

? ? ? ? free:

? ?它的函數定義如下

? ?void free (void* ptr);

? ?它的形參的指針就指向的是動態開辟的起始地址的位置,如果給它傳NULL,那么這個函數將什么都不會做。

? ?接下來我們對剛才的代碼做一個完善? ?

? ? ? ? 由圖可見,釋放代碼其實就兩行,但是至關重要。

? ? ? ? 大家可能會有疑惑,釋放完了空間之后,為什么還要將pi賦值為NULL指針,原因是因為剛才的pi指針接收了malloc動態開辟的空間,但是當free之后,剛才申請的那塊空間已經被釋放了,里邊的數據也已經不是剛才存進去的數據了,而此時pi指針里邊仍存放著那塊空間的地址,這就形成了野指針,所以給它賦值為NULL。

????????calloc和realloc

? ? ? ? calloc函數也是用來動態內存開辟空間的函數,它的函數定義如下

? ?void* calloc (size_t num,size_t size);

? ?函數的形參的意思就是為num個大小為size的元素開辟空間,并且calloc函數會把開辟的空間的每個字節都初始化為0。

????????calloc函數的使用舉例

#include<stdio.h>
#include<stdlib.h>
int main()
{//給10個大小為int類型的數據開辟空間//用malloc函數就相當于//malloc(10 * sizeof(int));int* pi = (int*)calloc(10, sizeof(int));if (pi == NULL){perror("calloc");return 1;}//開辟成功,使用//calloc會自動的給申請的空間初始化為0for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}//釋放free(pi);pi = NULL;return 0;
}

????????realloc函數是用來對我們動態申請的內存進行調整的。它的函數定義如下。

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

? ?ptr是要調整空間內存的起始地址。size為調整之后的新大小。返回值為調整后的內存的起始位置。

? ? ? ? 對于realloc函數的重新調整空間大小,總共有三種情況。

? ? ? ? 情況1:原有空間之后有足夠的空間。

? ? ? ? 情況2:原有的空間之后沒有足夠的空間。

? ? ? ? 情況3:重新調整空間失敗,返回NULL指針。

????????realloc函數的使用舉例

#include<stdio.h>
#include<stdlib.h>
int main()
{//申請空間int* pi = (int*)malloc(40);if (pi == NULL){perror("malloc");return 1;}//使用空間for (int i = 0; i < 10; i++){*(pi + i) = i++;}for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}//內存不夠,重新調整//注意,這個返回值不能用剛才的pi來接收,因為可能開辟空間失敗返回NULL,這樣就導致原來開辟的空間也找不到了。int* ptr = (int*)realloc(pi, 80);if (ptr == NULL){perror("realloc");return 1;}else//開辟成功{pi = ptr;ptr = NULL;}//繼續使用........//釋放空間free(pi);pi = NULL;return 0;
}

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

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

相關文章

C++標準庫(std)詳解

C標準庫&#xff08;std&#xff09;詳解——目錄C標準庫&#xff08;std&#xff09;詳解一、命名空間&#xff08;namespace&#xff09;二、主要組件1. 輸入輸出流&#xff08;<iostream>&#xff09;2. 字符串處理&#xff08;<string>&#xff09;3. STL容器&…

ESP32的OTA升級詳解:3. 搭建node/python服務器升級(native ota原生API)

一、OTA兩種方式&#xff1a;app_update 與 esp_https_ota 區別 ESP32/ESP32-S2/ESP32-C3等可通過Wi-Fi或以太網下載新固件到OTA分區實現運行時升級。ESP-IDF提供兩種OTA升級方法&#xff1a; 使用app_update組件的原生API使用esp_https_ota組件的簡化API(支持HTTPS升級) 本次…

byte[]作為接口參數傳遞的方法

在C#中通過WebService或API傳遞byte參數&#xff08;如文件、圖像等二進制數據&#xff09;時&#xff0c;通常有以下幾種實現方式&#xff1a; ?1. 使用Base64編碼&#xff08;推薦REST API&#xff09;? 將byte數組轉換為Base64字符串傳輸&#xff0c;適用于JSON格式的API&…

元宇宙與Web3的深度融合:構建沉浸式數字體驗的愿景與挑戰

一、技術特征與融合基礎1. 元宇宙的技術架構&#xff08;2025年&#xff09;空間構建技術&#xff1a;3D建模與渲染&#xff1a;實時渲染引擎&#xff08;如Unity HDRP&#xff09;支持路徑追蹤光追&#xff0c;AI生成模型&#xff08;NVIDIA Get3D&#xff09;3秒生成3D場景。…

什么是腦裂

腦裂定義&#xff1a; 腦裂是分布式系統中由于網絡分區&#xff08;Network Partition&#xff09;導致集群節點被分割成多個獨立子集&#xff0c;每個子集認為自己是唯一合法的集群&#xff0c;從而導致數據不一致或系統行為異常的現象。詳細工作原理&#xff1a;發生原因&…

川翔云電腦:云端算力新標桿,創作自由無邊界

一、旗艦機型&#xff1a;4090Ultra 48G 顯存顛覆硬件限制 川翔云電腦最新上線的RTX 4090Ultra 48G 顯存機型&#xff0c;采用 NVIDIA Ada Lovelace 架構&#xff0c;單卡顯存容量達 48GB GDDR6X&#xff0c;較傳統 4090 翻倍&#xff0c;可直接加載 1200 萬面數的超復雜模型&a…

貪心算法(排序)

碼蹄集OJ-活動安排 #include<bits/stdc.h> using namespace std; struct MOOE {int s,e; }; bool compare(const MOOE&a,const MOOE&b) {return a.e<b.e; } int main( ) {int n;cin>>n;vector<MOOE>a(n);for(int i0;i<n;i){cin>>a[i].…

詳解序數回歸損失函數ordinal_regression_loss:原理與實現

在醫療 AI 領域&#xff0c;很多分類任務具有有序類別的特性&#xff0c;如疾病嚴重程度&#xff08;輕度→中度→重度&#xff09;、腫瘤分級&#xff08;G1→G2→G3&#xff09;等。這類任務被稱為序數回歸&#xff08;Ordinal Regression&#xff09;&#xff0c;需要特殊的…

SQL增查

建完庫與建完表后后:1.分別查詢student表和score表的所有記錄student表&#xff1a;score表:2.查詢student表的第2條到5條記錄SELECT * FROM student LIMIT 1,4;3.從student表中查詢計算機系和英語系的學生的信息SELECT * FROM student-> WHERE department IN (計算機系, 英…

二分答案之最大化最小值

參考資料來源靈神在力扣所發的題單&#xff0c;僅供分享學習筆記和記錄&#xff0c;無商業用途。 核心思路&#xff1a;本質上是求最大 應用場景&#xff1a;在滿足條件的最小值區間內使最大化 檢查函數&#xff1a;保證數據都要大于等于答案 補充&#xff1a;為什么需要滿…

OCR 賦能檔案數字化:讓沉睡的檔案 “活” 起來

添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09;企業產品檔案包含設計圖紙、檢測報告、生產記錄等&#xff0c;傳統數字化僅靠掃描存檔&#xff0c;后續檢索需人工逐份翻閱&#xff0c;效率極低。?OCR 產品檔案解決方案直擊痛點&#xff1a;通過智能識別技…

力扣118.楊輝三角

思路1.新建一個vector的vector2.先把空間開出來&#xff0c;然后再把里面的值給一個個修改開空間的手段&#xff1a;new、構造函數、reserve、resize因為我們之后要修改里面的數據&#xff0c;這就意味著我們需要去讀取這個數據并修改&#xff0c;如果用reserve的話&#xff0c…

Python 網絡爬蟲 —— 提交信息到網頁

一、模塊核心邏輯“提交信息到網頁” 是網絡交互關鍵環節&#xff0c;借助 requests 庫的 post() 函數&#xff0c;能模擬瀏覽器向網頁發數據&#xff08;如表單、文件 &#xff09;&#xff0c;實現信息上傳&#xff0c;讓我們能與網頁背后的服務器 “溝通”&#xff0c;像改密…

SpringMVC4

一、SpringMVC 注解與項目開發流程1.1注解的生命周期- Target、Retention 等元注解&#xff1a;- Target(ElementType.TYPE) &#xff1a;說明這個注解只能用在類、接口上。- Retention(RetentionPolicy.RUNTIME) &#xff1a;說明注解在運行時保留&#xff0c;能通過反射獲取…

數據結構排序算法總結(C語言實現)

以下是常見排序算法的總結及C語言實現&#xff0c;包含時間復雜度、空間復雜度和穩定性分析&#xff1a;1. 冒泡排序 (Bubble Sort)思想&#xff1a;重復比較相鄰元素&#xff0c;將較大元素向后移動。 時間復雜度&#xff1a;O(n)&#xff08;最好O(n)&#xff0c;最壞O(n)) 空…

嵌入式學習-PyTorch(2)-day19

很久沒有學了&#xff0c;期間打點滴打了一個多星期&#xff0c;太累了&#xff0c;再加上學了一下Python語法基礎&#xff0c;再終于開始重新學習pytorchtensorboard 的使用import torch from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs…

Prompt Engineering 快速入門+實戰案例

資料來源&#xff1a;火山引擎-開發者社區 引言 什么是 prompt A prompt is an input to a Generative AI model, that is used to guide its output. Prompt engineering is the process of writing effective instructions for a model, such that it consistently generat…

「源力覺醒 創作者計劃」_文心開源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得

文章目錄背景操作流程開源模型選擇算力服務器平臺開通部署一個算力服務器登錄GPU算力服務器進行模型的部署FastDeploy 快速部署服務安裝paddlepaddle-gpu1. 降級沖突的庫版本安裝fastdeploy直接部署模型&#xff08;此處大約花費15分鐘時間&#xff09;放行服務端口供公網訪問最…

P10719 [GESP202406 五級] 黑白格

題目傳送門 前言&#xff1a;不是這樣例有點過分了哈&#xff1a; 這是我沒考慮到無解的情況的得分&#xff1a; 這是我考慮了的得分&#xff1a; 總而言之&#xff0c;就是一個Subtask 你沒考慮無解的情況&#xff08;除了Subtask #0&#xff09;,就會WA一大片,然后這個Subt…

AWS RDS PostgreSQL可觀測性最佳實踐

AWS RDS PostgreSQL 介紹AWS RDS PostgreSQL 是亞馬遜云服務&#xff08;AWS&#xff09;提供的托管型 PostgreSQL 數據庫服務。托管服務&#xff1a;AWS 管理數據庫的底層基礎設施&#xff0c;包括硬件、操作系統、數據庫引擎等&#xff0c;用戶無需自行維護。高性能&#xff…