C54-動態開辟內存空間

1.malloc

  • 原型void* malloc(size_t size);(位于 <stdlib.h> 頭文件中)

  • 作用:分配一塊連續的、未初始化的內存塊,大小為 size 字節。

  • 返回值:

    • 成功:返回指向分配內存首地址的 void* 指針(需強制類型轉換后才能使用)。
    • 失敗(如內存不足):返回 NULL
  • 代碼示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p;             // 1. 聲明一個 char 類型的指針 pp=(char *)malloc(1); // 2. 動態分配 1 字節的內存,并將地址賦給 p*p= 'c';             // 3. 將字符 'c' 存儲到 p 指向的內存中printf("%c\n",*p);p=(char *)malloc(12);strcpy(p,"Hello!");printf("%s",p);return 0;
}
  • 成果展示:image-20250529122947592

2.realloc

作用:調整動態內存塊大小(擴大/縮小)。

原型

void *realloc(void *ptr, size_t new_size);
  • ptr:原內存指針。
  • new_size:新大小(字節)。若為 0ptr 非空,等同 free

關鍵點

  1. 可能移動內存:若原位置空間不足,會分配新內存并復制數據。

示例

int *arr = malloc(5 * sizeof(int));  
arr = realloc(arr, 10 * sizeof(int));  // 擴容到10個int
free(arr);
  • 代碼示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p;             p=(char *)malloc(7);strcpy(p,"Hello!");printf("%s\n",p);printf("擴容前地址:%p\n",p);free(p); p=NULL;int len;len=strlen("若原位置空間不足,會分配新內存并復制數據");p=realloc(p,len+1);strcpy(p,"若原位置空間不足,會分配新內存并復制數據");printf("%s\n",p);printf("擴容后地址:%p\n",p);return 0;
}
  • 成果展示:

image-20250529160228308

3.free

作用:釋放 malloc/calloc/realloc 分配的動態內存,防止內存泄漏。

用法

void free(void *ptr);  // ptr 必須是動態分配的內存地址

關鍵點

  1. 必須配對使用:每個 malloc 都要對應一個 free
  2. 避免懸空指針:釋放后指針應置 NULLptr = NULL)。
  3. 禁止重復釋放:對同一內存多次 free 會導致崩潰。
  4. 僅用于動態內存:靜態數組(如 int a[10])不可 free

示例

int *p = malloc(10 * sizeof(int));  
if (p != NULL) {  // 使用內存...  free(p);  p = NULL; // 安全操作  
}

4.memset

功能

快速將某塊內存的所有字節設為指定值(按字節填充)。

函數原型
void *memset(void *ptr, int value, size_t num);  
  • ptr:目標內存首地址(如數組、結構體)。
  • value:填充值(實際取低8位,范圍0~255)。
  • num:填充的字節數(通常用 sizeof 計算)。
  • 返回值:返回 ptr 本身。

常用場景
  1. 清零內存(最安全):

    int arr[10];  
    memset(arr, 0, sizeof(arr)); // 所有字節置0  
    
  • 代碼示例:
#include <stdio.h>
#include <string.h>int main()
{int arr[10]={1,2,3,4,};memset(arr,0,sizeof(arr));for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
  • 成果展示:

image-20250529215753001

  1. 填充字符數組:

    char str[10];  
    memset(str, 'A', 5);  // 前5字節設為'A'(需手動補'\0')  
    
  • 代碼示例:
#include <stdio.h>
#include <string.h>int main()
{char arr[10];memset(arr,'S',5);for(int i=0;i<10;i++){printf("%c ",arr[i]);}return 0;
}
  • 成果展示:

image-20250529220119589

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

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

相關文章

ELK服務搭建-0-1搭建記錄

ELK搭建 需要準備一臺linux服務器&#xff08;最好是CentOS7&#xff09;,內存至少4G以上&#xff08;三個組件都比較占用內存&#xff09; 演示基于ElasticSearch采用的是8.5.0版本 1、 Docker安裝Elasticsearch 創建一個網絡 因為我們還需要部署kibana容器、logstash容器&am…

調參指南:如何有效優化模型訓練效果

?? 調參指南:如何有效優化模型訓練效果(深度學習實戰) 模型跑通不難,調得好才是本事。本篇文章將系統講解如何在訓練過程中有效調參,從學習率到網絡結構,從損失函數到正則化,讓你的模型效果“飛升”。 ?? 一、為什么需要調參? 初學者常常以為模型訓練完就“任務完…

laya3的2d相機與2d區域

2d相機和2d區域都繼承自Sprite。 2d相機必須作為2d區域的子節點&#xff0c;且2d相機必須勾選isMain才能正常使用。 2d區域下如果沒有主相機&#xff0c;則他和Sprite無異&#xff0c;他的主要操作皆是針對主相機。 2d相機可以調整自己的移動范圍&#xff0c;是否緊密跟隨&a…

【保姆級教程】Windows部署LibreTV+cpolar實現遠程影音庫訪問全步驟

文章目錄 前言1.關于LibreTV2.docker部署LibreTV3.簡單使用LibreTV4.安裝cpolar內網穿透5.配置ward公網地址6.配置固定公網地址總結 前言 當周末的閑暇時光來臨時&#xff0c;您是否也習慣性地癱倒在沙發上&#xff0c;渴望通過影視作品緩解一周的疲憊&#xff1f;然而在準備點…

Windows安裝Docker部署dify,接入阿里云api-key進行rag測試

一、安裝docker 1.1 傻瓜式安裝docker Get Docker | Docker Docs Docker原理&#xff08;圖解秒懂史上最全&#xff09;-CSDN博客 官網選擇好windows的安裝包下載&#xff0c;傻瓜式安裝。如果出現下面的報錯&#xff0c;說明主機沒有安裝WSL 1.2 解決辦法 安裝 WSL | Mic…

Cursor 與DeepSeek的完美契合

這兩天在看清華大學最近出的一個關于deepseek入門的官方視頻中&#xff0c;看了幾個deepseek的應用場景還是能夠感覺到它的強大之處的&#xff0c;例如根據需求生成各種markdown格式的代碼&#xff0c;再結合市面上已有的一些應用平臺生成非常好看的流程圖&#xff0c;PPT,報表…

【深度學習】13. 圖神經網絡GCN,Spatial Approach, Spectral Approach

圖神經網絡 圖結構 vs 網格結構 傳統的深度學習&#xff08;如 CNN 和 RNN&#xff09;在處理網格結構數據&#xff08;如圖像、語音、文本&#xff09;時表現良好&#xff0c;因為這些數據具有固定的空間結構。然而&#xff0c;真實世界中的很多數據并不遵循網格結構&#x…

[Python] 避免 PyPDF2 寫入 PDF 出現黑框問題:基于語言自動匹配系統字體的解決方案

在使用 Python 操作 PDF 文件時,尤其是在處理中文、日語等非拉丁字符語言時,常常會遇到一個令人頭疼的問題——文字變成“黑框”或“方塊”,這通常是由于缺少合適的字體支持所致。本文將介紹一種自動選擇系統字體的方式,結合 PyPDF2 模塊解決此類問題。 一、問題背景:黑框…

Java求職面試:從核心技術到AI與大數據的全面考核

Java求職面試&#xff1a;從核心技術到AI與大數據的全面考核 第一輪&#xff1a;基礎框架與核心技術 面試官&#xff1a;謝飛機&#xff0c;咱們先從簡單的開始。請你說說Spring Boot的啟動過程。 謝飛機&#xff1a;嗯&#xff0c;Spring Boot啟動的時候會自動掃描組件&…

Espresso 是什么

Espresso 是 Android 開發者的首選 UI 測試工具&#xff0c;是 Google 官方推出的 Android 應用 UI 測試框架&#xff0c;專為 白盒測試 設計&#xff0c;強調 速度快、API 簡潔&#xff0c;適合開發者在編寫代碼時同步進行自動化測試。它是 Android Jetpack 測試工具的一部分&…

Axios 如何通過配置實現通過接口請求下載文件

前言 今天&#xff0c;我寫了 《Nodejs 實現 Mysql 數據庫的全量備份的代碼演示》 和 《NodeJS 基于 Koa, 開發一個讀取文件&#xff0c;并返回給客戶端文件下載》 兩篇文章。在這兩篇文章中&#xff0c;我實現了數據庫的備份&#xff0c;和提供數據庫下載等接口。 但是&…

IDEA項目推送到遠程倉庫

打開IDEA——>VCS——>Creat Git 選擇項目 push提交到本地 創建遠程倉庫 復制地址 定義遠程倉庫 推送 推送成功

Prompt工程:解鎖大語言模型的終極密鑰

Prompt工程&#xff1a;解鎖大語言模型的終極密鑰 一、引言&#xff1a;Prompt的戰略價值重構 在人工智能技術加速滲透的2025年&#xff0c;Prompt&#xff08;提示詞&#xff09;作為連接人類意圖與大語言模型&#xff08;LLM&#xff09;的核心接口&#xff0c;其戰略地位已…

架構意識與性能智慧的雙重修煉

架構意識與性能智慧的雙重修煉 ——現代軟件架構師的核心能力建設指南 作者:藍葛亮 ??引言 在當今快速發展的技術環境中,軟件架構師面臨著前所未有的挑戰。隨著業務復雜度的不斷增長和用戶對性能要求的日益嚴苛,如何在架構設計中平衡功能實現與性能優化,已成為每個技術…

Flutter下的一點實踐

目錄 1、背景2、refena創世紀代碼3、localsend里refena的刷新3.1 初始狀態3.2 發起設備掃描流程3.3 掃描過程3.3 刷新界面 4.localsend的設備掃描流程4.1 UDP廣播設備注冊流程4.2 TCP/HTTP設備注冊流程4.3 localsend的服務器初始化工作4.4總結 1、背景 在很久以前&#xff0c;…

Allegro 輸出生產數據詳解

說明 用于PCB裸板的生產可以分別單獨創建文件 光繪數據(Gerber)、鉆孔(NC Drill)、IPC網表;或者通過ODB++或IPC2581文件(這是一個新格式),它包含生產裸板所需要的所有信息 光繪數據 Artwork Gerber 光繪數據一般包含設計中各個層面的蝕刻線路、阻焊、鉛錫、字符等信…

5.LoadBalancer負載均衡服務調用

目錄 一、Ribbon目前也進入維護模式 二、spring-cloud-loadbalancer概述 三、spring-cloud-loadbalancer負載均衡解析 1.負載均衡演示案例-理論 2.負載均衡演示案例-實操 按照8001拷貝后新建8002微服務 啟動Consul,將8001/8002啟動后注冊進微服務 Consul數據持久化配置…

linux安裝ffmpeg7.0.2全過程

?編輯 白眉大叔 發布于 2025年4月16日 評論關閉 閱讀(341) centos 編譯安裝 ffmpeg 7.0.2 &#xff1a;連接https://www.baimeidashu.com/19668.html 下載 FFmpeg 源代碼 在文章最后 一、在CentOS上編譯安裝FFmpeg 以常見的CentOS為例&#xff0c;FFmpeg的編譯說明頁面為h…

視頻逐幀提取圖片的工具

軟件功能&#xff1a;可以將視頻逐幀提取圖片&#xff0c;可以設置每秒提取多少幀&#xff0c;選擇提取圖片質量測試環境&#xff1a;Windows 10軟件設置&#xff1a;由于軟件需要通過FFmpeg提取圖片&#xff0c;運行軟件前請先設置FFmpeg&#xff0c;具體步驟 1. 請將…

java精簡復習

MyBatis批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO users(name, age) VALUES<foreach collection"list" item"item" separator",">(#{item.name}, #{item.age})</foreac…