C語言——動態內存函數(malloc、calloc、realloc、free)

了解動態內存函數

  • 前言:
  • 一、malloc函數
  • 二、calloc函數
  • 三、realloc函數
  • 四、free函數

前言:

在C語言中,動態內存函數是塊重要的知識點。以往,我們開辟空間都是固定得,數組編譯結束后就不能繼續給它開辟空間了,開辟的空間滿了,就不能在開辟空間了(就是不能在添加數據了)。學習本文章,我們就可以解決這個問題,向內存申請空間,滿啦可以繼續申請空間。

一、malloc函數

需要頭文件——<stdlib.h>
在這里插入圖片描述
瀏覽器直接翻譯:
在這里插入圖片描述
malloc函數(動態內存開辟的函數):

void* malloc(size_t size);

功能:
這個函數向內存申請一個連續可用的空間,并返回指向這塊空間的指針。

  • 如果開辟成功,則返回一個指向開辟好空間的指針。
  • 如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
  • 返回值的類型是void* ,所以malloc函數并不知道開辟空間的類型,具體在使用的時候由使用者自己決定。
  • 如果size為0,malloc的行為是標準還是未定義的,由編譯器決定。
  • malloc申請的空間,當程序退出時,要還給操作系統,當程序不退出,動態申請的內存,不會主動釋放,需要用free函數來釋放。
    malloc申請的內存空間:
    malloc申請到空間后,直接返回這個空間的首地址,不會初始化空間的內容。
    舉個例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//變長數組的知識點(vs不能用,gcc可以用)//int num = 0;//scanf("%d", &num);//int arr[num] = { 0 };int* ptr = NULL;ptr = (int*)malloc(40);if (ptr == NULL)//判斷ptr指針是否為空{perror("malloc");exit; }else{int i = 0;for (i = 0; i < 10; i++)//給開辟的空間賦值ptr[i] = i + 1;}free(ptr);//釋放ptr指向的空間ptr = NULL;//讓ptr指向空return 0;
}

二、calloc函數

需要頭文件——<stdlib.h>
在這里插入圖片描述
瀏覽器直接翻譯:
在這里插入圖片描述
calloc函數(動態內存分配函數):

void* calloc(size_t num, size_t size);

功能:

  • 函數的功能是,為num個大小為size元素開辟一塊空間,并且把空間的每一個字節初始化為0.
  • 與malloc函數的區別,只在于calloc函數會在返回地址之前把申請空間的每一個字節初始化為0.
    舉個例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{int* p = (int*)calloc( 10,sizeof(int));if (p == NULL)//成立,開辟失敗{perror("calloc");exit;}free(p);p = NULL;return 0;
}

p指向的地址:
在這里插入圖片描述

三、realloc函數

需要頭文件——<stdlib.h>
在這里插入圖片描述
瀏覽器直接翻譯:
在這里插入圖片描述
realloc函數(動態內存管理更加靈活):
有時候我們發現過去申請的空間小了,有時候我們會覺得過去申請的空間過大,為了合理使用內存,我們一定要對內存的大小做靈活的調整。realloc函數可以做到對動態開辟內存大小進行調整。

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

功能:

  • ptr是要調整的內存地址。
  • size是調整后的新大小。
  • 返回值為調整之后的內存起始位置。
  • 這個函數在調整原空間大小的基礎上,還會將原來的數據移到新的空間。
    注意:
    realloc調整內存空間有兩種情況。
    • 情況1:原有空間之后有足夠大的空間(原地擴容)。
      當是情況1的時候,要擴展內存就直接在原有內存之后直接追加空間,原來空間的數據不發生改變。
      在這里插入圖片描述

    • 情況2:原有空間后面沒有足夠大的空間(異地擴容)。
      當是情況2的時候,原有空間后面沒有足夠多的空間時,擴展的方法是:在堆空間上另外找一個合適大小的連續空間來使用。這樣函數返回的是一個新的內存地址。
      在這里插入圖片描述
      所以我們在使用realloc函數的時候一定要注意:
      1、開辟新的空間。
      2、 會將舊的空間數據拷貝到新的空間。
      3、釋放舊的空間。
      4、返回新空間的起始地址。
      舉個例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{int* ptr =(int*) malloc( 100 );if (ptr != NULL){
//可以使用這個空間}else{perror("malloc");exit;}//擴展空間int* p = (int*)realloc(ptr, 1000);//可能增容失敗if (p != NULL){//增容成功ptr = p;//p指向的空間交給ptr去維護}free(ptr);//把開辟早堆上的空間釋放掉ptr = NULL;return 0;
}

四、free函數

需要頭文件——<stdlib.h>
在這里插入圖片描述
瀏覽器直接翻譯:
在這里插入圖片描述
free函數(釋放動態開辟的內存):

void* free(void* ptr);

功能:

  • 如果參數ptr指向的那個空間不是動態開辟的,那free函數的行為是未定義的。
  • 如果參數ptr是NULL指針,則函數什么事都不做。

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

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

相關文章

貼吧照片和酷狗音樂簡單爬取

爬取的基本步驟 很簡單&#xff0c;主要是兩大步 向url發起請求 這里注意找準對應資源的url&#xff0c;如果對應資源不讓程序代碼訪問&#xff0c;這里可以偽裝成瀏覽器發起請求。 解析上一步返回的源代碼&#xff0c;從中提取想要的資源 這里解析看具體情況&#xff0c;一…

13 計算機視覺-代碼詳解

13.2 微調 為了防止在訓練集上過擬合&#xff0c;有兩種辦法&#xff0c;第一種是擴大訓練集數量&#xff0c;但是需要大量的成本&#xff1b;第二種就是應用遷移學習&#xff0c;將源數據學習到的知識遷移到目標數據集&#xff0c;即在把在源數據訓練好的參數和模型&#xff…

淺談現代醫院手術室IT供配電系統的設計與研究

安科瑞 華楠 &#xff3b;摘要&#xff3d; 隨著人們的生活水平的不斷提高&#xff0c;醫療條件的不斷改善&#xff0c;人們對健康越來越重視同時對醫療條件的要求也越來越高&#xff0c;對醫院手術室醫療設施提出了新的要求。以往醫院普通手術室狀況已不能滿足人們的要求&…

GPT的第一個創作

嗨&#xff0c;大家好&#xff0c;我是賴興泳&#xff01;今天&#xff0c;我要和大家聊一聊前端開發&#xff0c;就像我用音符創造音樂一樣&#xff0c;前端開發也是創造美麗的用戶界面的過程。 前端開發是構建網站和應用程序用戶界面的關鍵部分。就像音樂家需要精心編排音符…

騰訊云CVM服務器端口在安全組中打開!

騰訊云服務器CVM端口怎么開通&#xff1f;騰訊云服務器端口是通過配置安全組規則來開通的&#xff0c;騰訊云服務器網以開通80端口為例來詳細說下騰訊云輕量應用服務器開啟端口的方法&#xff0c;其他的端口的開通如8080、1433、443、3306、8888等端口也適用于此方法&#xff0…

基于Yolov5與LabelMe訓練自己數據的圖像分割完整流程

基于Yolov5與LabelMe訓練自己數據的實例分割完整流程 1. Yolov5配置2. 創建labelme虛擬環境4. 接下來開始使用labelme繪制分割數據集4.1 json to txt4.2 劃分數據集(可分可不分) 5. 訓練 1. Yolov5配置 參照這邊文章&#xff1a; https://blog.csdn.net/ruotianxia/article/de…

okcc對接ASR平臺,okcc客戶投訴的安全問題

客戶投訴: 客戶為什么要投訴&#xff1f;實際上分為兩種情況&#xff0c;一是客戶被冒犯到不能容忍導致的投訴&#xff0c;二是惡意投訴。降低客戶被冒犯投訴的概率&#xff0c;無非就是選擇客戶、規范用語、降低頻度&#xff1b;減少惡意投訴&#xff0c;回避是實踐證明最有效…

前端= 結構(HTML)+ 樣式(CSS)+ 行為(JavaScript)

前端開發確實涵蓋了行為&#xff08;JavaScript&#xff09;、樣式&#xff08;CSS&#xff09;和結構&#xff08;HTML&#xff09;這三個主要方面。這三個方面在前端開發中密切協作&#xff0c;共同構建用戶界面和用戶體驗。 結構&#xff08;Structure&#xff09;&#xff…

java # Servlet

一、什么是Servlet&#xff1f; Servlet是javaEE規范之一。規范就是接口。JavaWeb三大組件分別是&#xff1a;Servlet程序、Filter過濾器、Listener監聽器。Servlet是運行在服務器上的一個Java小程序&#xff0c;它可以接收客戶端發送來的請求&#xff0c;并響應數據給客戶端。…

Django筆記之中間件介紹

這一節介紹一下 Django 的中間件。 關于中間件&#xff0c;官方文檔的解釋為&#xff1a;中間件是一個嵌入 Django 系統的 request 和 response 的鉤子框架&#xff0c;是一個能夠全局改變 Django 輸入/輸出的系統。 我們可以這樣理解&#xff0c;一個 request 請求發送到 Dj…

《C語言深度解剖》.pdf

&#x1f407; &#x1f525;博客主頁&#xff1a; 云曦 &#x1f4cb;系列專欄&#xff1a;深入理解C語言 &#x1f4a8;吾生也有涯&#xff0c;而知也無涯 &#x1f49b; 感謝大家&#x1f44d;點贊 &#x1f60b;關注&#x1f4dd;評論 C語言深度解剖.pdf 提取碼:yunx

KCC@深圳開源讀書會即將舉辦,來與行業大咖面對面交流

KCC&#xff0c;全稱 KAIYUANSHE City Community&#xff08;中文&#xff1a;開源社城市社區&#xff09;是由開源社發起&#xff0c;旨在讓開源社區在每個城市落地生根的地域性開源組織。 自2023年2月份發起以來&#xff0c;我們已經在南京、上海、深圳、北京、硅谷、新加坡、…

iTOP-3568開發板使用OpenCV處理圖像-顏色轉換

本小節代碼在配套資料“iTOP-3568 開發板\03_【iTOP-RK3568 開發板】指南教程 \04_OpenCV 開發配套資料\05”目錄下&#xff0c;如下圖所示&#xff1a; cv2.cvtColor()函數功能&#xff1a; 將一幅圖像從一個色彩空間轉換到另一個色彩空間。 函數原型&#xff1a; cv2.cvt…

日常BUG—— maven編譯報錯

&#x1f61c;作 者&#xff1a;是江迪呀??本文關鍵詞&#xff1a;日常BUG、BUG、問題分析??每日 一言 &#xff1a;存在錯誤說明你在進步&#xff01; 一、問題描述 一個maven項目在由于在代碼中書寫了如下代碼&#xff1a; public static ConcurrentMap<…

DatenLord X Segmentfault直播預告 l CURP協議的工業化實踐

CURP協議 傳統單數據中心解決方案無法滿足跨數據中心的場景對性能和一致性的需求。DatenLord推出開源的分布式KV存儲Xline&#xff0c;針對多數據中心場景&#xff0c;實現數據的高性能跨云、跨數據中心共享訪問&#xff0c;并且保證數據的一致性&#xff0c;方便業務系統實現…

Nginx之lnmp架構

目錄 一.什么是LNMP二.LNMP環境搭建1.Nginx的搭建2.安裝php3.安裝數據庫4.測試Nginx與PHP的連接5.測試PHP連接數據庫 一.什么是LNMP LNMP是一套技術的組合&#xff0c;Llinux&#xff0c;Nnginx&#xff0c;Mmysql&#xff0c;Pphp 首先Nginx服務是不能處理動態資源請求&…

Android app專項測試之耗電量測試

前言 耗電量指標 待機時間成關注目標 提升用戶體驗 通過不同的測試場景&#xff0c;找出app高耗電的場景并解決 01、需要的環境準備 1、python2.7(必須是2.7&#xff0c;3.X版本是不支持的) 2、golang語言的開發環境 3、Android SDK 此三個的環境搭建這里就不詳細說了&am…

如何使用CSS實現一個純CSS的滾動條樣式?

聚沙成塔每天進步一點點 ? 專欄簡介? 使用CSS實現自定義滾動條樣式? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&#xff01;這個專欄是為那些對Web開發感興趣…

【數理知識】三維空間旋轉矩陣的歐拉角表示法,四元數表示法,兩者之間的轉換,Matlab 代碼實現

序號內容1【數理知識】自由度 degree of freedom 及自由度的計算方法2【數理知識】剛體 rigid body 及剛體的運動3【數理知識】剛體基本運動&#xff0c;平動&#xff0c;轉動4【數理知識】向量數乘&#xff0c;內積&#xff0c;外積&#xff0c;matlab代碼實現5【數理知識】最…

用Node.js吭哧吭哧擼一個運動主頁

簡單嘮嘮 某乎問題&#xff1a;人這一生&#xff0c;應該養成哪些好習慣&#xff1f; 問題鏈接&#xff1a;https://www.zhihu.com/question/460674063 如果我來回答肯定會有定期運動的字眼。 平日里也有煅練的習慣&#xff0c;時間久了后一直想把運動數據公開&#xff0c;…