【C語言】動態內存管理常用函數

前言

我們在之前學習的數組開辟的空間是固定不變的,有時候我們需要的空間??在程序運?的時候才能知道~

c語言中的動態內存開辟,讓程序員??可以根據實際需求申請和釋放相應空間,這使得空間的開辟變得靈活了許多。

歡迎關注個人主頁:逸狼


創造不易,可以點點贊嗎~

如有錯誤,歡迎指出~

目錄

前言

malloc函數

malloc函數的使用

free函數

free函數的使用

calloc函數

calloc函數的使用

realloc函數

realloc函數的使用

realloc與malloc函數的聯系


malloc函數

void* malloc (size_t size);

malloc函數的作用是開辟動態內存

這個函數向內存申請?塊連續可?的空間,并返回指向這塊空間的指針

  • 如果開辟成功,則返回?個指向開辟好空間的指針。
  • 如果開辟失敗,則返回?個 NULL 指針,因此malloc的返回值?定要做檢查。

返回值的類型是 void* ,所以malloc函數并不知道開辟空間的類型,具體在使?的時候使?者??來決定。

如果參數 size 為0,malloc的?為是標準是未定義的,取決于編譯器。

malloc 申請的空間是在內存的堆區

malloc函數的使用


#include<stdio.h>
#include<stdlib.h>//malloc所涉及的頭文件
int main()
{//int arr[10] = { 0 };//開辟的空間不可以更改,固定死了//void* malloc (size_t size)  size的單位是字節//malloc函數只知道申請空間,不知道返回類型是什么int* p=(int*)malloc(40);//向內存申請40個字節的空間,他的返回值是void*//強制類型轉換成int*后,再賦值給指針變量p,就相當于int arr[10]if (p == NULL)//判斷p指針是否為空{perror("malloc");return 1;}//訪問并使用malloc開辟的空間for (int i = 0; i < 10; i++){*(p+i)=i;}//打印for (int i = 0; i < 10; i++){printf("%d " ,* (p + i));}return 0;
}

free函數

void free (void* ptr);

free函數?來釋放動態開辟的內存。

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

malloc和free都聲明在 stdlib.h 頭?件中。

free函數的使用

	//釋放空間free(p);p = NULL;//用free釋放空間后,空間釋放了,但p仍然記得地址起始位置//避免p變為野指針,將p設為NULL

calloc函數

void* calloc (size_t num, size_t size);

  • calloc函數也是?來動態內存分配。與malloc函數的區別 是calloc函數會將值全部初始化為0而malloc函數不會
  • calloc函數的功能是num 個??為 size 的元素開辟?塊空間

calloc函數的使用

int main()
{//                  元素個數,元素大小int* p = (int*)calloc(10,sizeof(int));if (p == NULL)//判斷p指針是否為空{perror("calloc");return 1;}//calloc函數會將值全部初始化為0//打印for (int i = 0; i < 10; i++){printf("%d ", *(p + i));}//釋放空間free(p);p=NULL;//避免p變為野指針,將p設為NULLz	return 0;
}

realloc函數

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

realloc函數開辟空間有兩種情況:

  1. 原空間后面有足夠的空間,直接擴大,返回原空間的起始地址
  2. 原空間后面沒有足夠的空間,realloc會在堆區重新找一個空間(滿足需求的),并且把原數據拷貝到新的空間,然后釋放舊的空間,同時返回新空間的起始位置

realloc函數的使用

#include<stdio.h>
#include<stdlib.h>
int main()
{int* p=(int*)malloc(40);if (p == NULL)//判斷p指針是否為空{perror("malloc");return 1;}//若空間不夠,想要擴大空間,20個整形
//參數:(指針,想要變成的大小)int* ptr = (int*)realloc(p, 20 * sizeof(int));if (ptr != NULL)//先把判斷ptr是否為空指針,再把ptr賦值給p{//若直接用p接收,若開辟空間失敗,p會被置為NULL,造成原空間找不到了p = ptr;}else{perror("realloc");}
//	realloc函數不會初始化空間
//	使用空間for (int i = 0; i < 20; i++){*(p+i)=i;}//打印for (int i = 0; i < 20; i++){printf("%d " ,* (p + i));}//釋放空間free(p);p = NULL;return 0;
}

realloc與malloc函數的聯系

以下代碼的意思是將指針為NULL的地址擴為40字節空間,相當于使用malloc函數開辟空間


int main()
{int* p = (int*)realloc(NULL, 40);//等價于mallocreturn 0;
}

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

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

相關文章

小程序配置服務器域名的操作步驟(入門級)

將詳細列出小程序配置服務器域名的操作步驟&#xff1a; 服務器選購推薦&#xff1a;騰訊云輕量服務器 點擊以下任一云產品鏈接&#xff0c;跳轉后登錄&#xff0c;自動享有所有云產品優惠權益&#xff1a; 經過筆者親測&#xff0c;強烈推薦騰訊云輕量應用服務器作為游戲服…

微服務簡介及其相關技術棧

目錄 1、簡介 2、技術棧 3、單體架構 4、分布式架構 5、微服務 6、總結 &#x1f343;作者介紹&#xff1a;雙非本科大三網絡工程專業在讀&#xff0c;阿里云專家博主&#xff0c;專注于Java領域學習&#xff0c;擅長web應用開發、數據結構和算法&#xff0c;初步涉獵Pyth…

【QT+QGIS跨平臺編譯】之五十七:【QGIS_CORE跨平臺編譯】—【VECTOR_TILE生成】

文章目錄 一、protoc二、生成來源三、構建過程一、protoc Protocol Buffers(簡稱 protobuf)是一種輕量級、高效的數據序列化框架,它可以將結構化數據序列化為二進制格式,同時還可以進行反序列化和數據壓縮。相比于 XML 和 JSON 等傳統的文本序列化格式,protobuf 采用二進制…

wpa_supplicant交叉編譯

文章目錄 源碼編譯openssl編譯libnl交叉編譯WPA 開發板測試使用 源碼 wpa_supplicant官網&#xff1a;http://w1.fi/wpa_supplicant/ GIT源&#xff1a;git://w1.fi/hostap.git openssl 源碼&#xff1a; https://www.openssl.org/ libnl 源碼&#xff1a; https://github.c…

自定義preference的使用

自定義preference的使用 control_iconsize_preference_top.xmlcontrol_iconsize_preference_middle.xmlcontrol_iconsize_preference_bottom.xmlcontrol_iconsize_preference_airplane.xmlcontrol_iconsize_preference_no_arrow_top.xmlcontrol_iconsize_preference_no_arrow_m…

3 開源鴻蒙OpenHarmony4.1源碼下載、編譯,生成OHOS_Image可執行文件的最簡易流程

開源鴻蒙OpenHarmony4.1源碼下載、編譯&#xff0c;生成OHOS_Image可執行文件的最簡易流程 作者將狼才鯨日期2024-03-01 準備一臺Windows電腦 安裝VMware或者VMware Player虛擬機 從華為鏡像下載Ubuntu系統&#xff0c;用國內源下載速度更快 Ubuntu 鏡像說明https://repo.hu…

map和set例題應用

個人主頁&#xff1a;Lei寶啊 愿所有美好如期而遇 目錄 第一題 第二題 第三題 第一題 隨機鏈表的復制https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 思路 首先遍歷舊鏈表&#xff0c;并創建新節點&#xff0c;同時用map將舊節點與新節點…

python模型訓練

目錄 1、新建模型 train_model.py 2、運行模型 &#xff08;1&#xff09;首先會下載data文件庫 &#xff08;2&#xff09;完成之后會開始訓練模型&#xff08;10次&#xff09; 3、 訓練好之后&#xff0c;進入命令集 4、輸入命令&#xff1a;python -m tensorboard.ma…

網絡工程師筆記6

ICMP協議 Internet控制報文協議ICMP(InternetControlMessage Protocol)是網絡層的一個重要協議。ICMP協議用來在網絡設備間傳遞各種差錯和控制信息&#xff0c;它對于收集各種網絡信息、診斷和排除各種網絡故障具有至關重要的作用。使用基于ICMP的應用時&#xff0c;需要對ICMP…

Vue.js+SpringBoot開發社區買菜系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、系統設計2.1 功能模塊設計2.1.1 數據中心模塊2.1.2 菜品分類模塊2.1.3 菜品檔案模塊2.1.4 菜品訂單模塊2.1.5 菜品收藏模塊2.1.6 收貨地址模塊 2.2 可行性分析2.3 用例分析2.4 實體類設計2.4.1 菜品分類模塊2.4.2 菜品檔案模塊2.4.3…

多輸入多輸出 | Matlab實現RIME-BP霜冰算法優化BP神經網絡多輸入多輸出預測

多輸入多輸出 | Matlab實現RIME-BP霜冰算法優化BP神經網絡多輸入多輸出預測 目錄 多輸入多輸出 | Matlab實現RIME-BP霜冰算法優化BP神經網絡多輸入多輸出預測預測效果基本介紹程序設計往期精彩參考資料 預測效果 基本介紹 多輸入多輸出 | Matlab實現RIME-BP霜冰算法優化BP神經網…

Springboot+vue的考勤管理系統(有報告)。Javaee項目,springboot vue前后端分離項目。

演示視頻&#xff1a; Springbootvue的考勤管理系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot vue前后端分離項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層…

GitHub Copilot extension activation error: ‘No access to GitHub Copilot found‘

好不容易學生認證通過了&#xff0c;打開vscode用copilot結果一直報這個錯誤。我的原因是&#xff1a;還未給copilot授權&#xff0c; 通過了學生認證后要進入這里進行授權&#xff1a;

Vue Html中插入本地視頻(Video 標簽)

在 Vue 中插入本地視頻可以通過使用標簽來實現。你可以將視頻文件放在你的項目中的合適位置&#xff08;比如assets文件夾&#xff09;&#xff0c;然后在 Vue 組件中引用這個視頻文件。html同理 首先&#xff0c;在你的 Vue 項目中的assets文件夾下放入你的視頻文件&#xff…

k8s單機部署zookeeper

&#xff08;作者&#xff1a;陳玓玏&#xff09; 拉取鏡像&#xff1a;docker pull zookeeper&#xff1b;編輯yaml&#xff1a; apiVersion: v1 kind: Service metadata:name: zookeeperlabels:app: zookeeper spec:ports:- name: clientport: 2181protocol: TCPtargetP…

QT TCP傳輸文件+ui

TCPFile tcp協議傳輸文件 TCPFile.pro QT core gui networkclientwidget.h #include <QWidget> #include <QTcpSocket> // 通信套接字 #include <QFile>private slots:void on_pushButton_clicked();private:QTcpSocket *tcpSocket;QFile file; /…

selenium進階設置

1、無頭瀏覽設置和規避爬蟲檢測 問題一&#xff1a;有界面時可以展示的元素&#xff0c;無頭模式報錯element not interactable 解決方法&#xff1a;通過錯誤截圖發現&#xff0c;頁面上有該元素&#xff0c;但是頁面不夠大&#xff0c;沒有顯示想定位的元素。 from seleni…

centos7 安裝 docker-compose

1、直接參考官方&#xff1a; Install Compose standalone | Docker Docs 1、安裝命令 curl -SL https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 2、修改 docker-compose 執行權限 不修改執行權…

升級pycharm之后,jupyter無法識別新安裝的包

import sys print(sys.executable)在jupyter中運行&#xff0c;檢測一下當前jupyter內核運行在哪個環境中-再pycharm的setting里面設置jupyter環境并沒有什么用。需要重新在想要使用的環境中重新安裝jupyter內核&#xff0c;并且重啟。

c# cad2016系統變量解釋說明

一、cad系統變量設置和獲取 /// <summary> /// 設置CAD系統變量 /// </summary> /// <param name"name">變量名</param> /// <param name"value">變量值</param> public static void SetSystemVariable(string name,…