C語言初學者筆記【動態內存管理】

文章目錄

  • 一、為什么需要動態內存分配?
  • 二、malloc 和 free
    • 1. malloc
    • 2. free
  • 三、calloc 和 realloc
    • 1. calloc
    • 2. realloc
  • 四、常見的動態內存錯誤
    • 1. 對 NULL 解引用
    • 2. 越界訪問
    • 3. 對非動態內存使用 free
    • 4. 釋放部分動態內存
    • 5. 多次釋放同一塊內存
    • 6. 內存泄漏
  • 五、動態內存經典題目分析
  • 六、柔性數組(Flexible Array)
    • 1.定義
    • 2.特點
    • 3.優勢
  • 七、C/C++ 程序內存區域劃分
  • 總結


一、為什么需要動態內存分配?

已掌握的內存開辟方式:

· int val = 20; → 棧上開辟4字節
· char arr[10] = {0}; → 棧上開辟10字節連續空間

局限性:

· 空間大小固定
· 數組長度必須在編譯時確定

動態內存分配的優勢:

· 程序運行時才能確定所需空間大小
· 動態申請和釋放,更靈活


二、malloc 和 free

1. malloc

void* malloc(size_t size);

· 成功:返回指向開辟空間的指針
· 失敗:返回 NULL
· 返回值類型為 void*,需強制轉換
· 若 size = 0,行為未定義(編譯器決定)

2. free

void free(void* ptr);

· 釋放動態開辟的內存
· 若 ptr 非動態開辟,行為未定義
· 若 ptr 為 NULL,函數什么也不做

示例:

#include <stdio.h>
#include <stdlib.h>int main() {int num;scanf("%d", &num);int* ptr = (int*)malloc(num * sizeof(int));if (ptr != NULL) {for (int i = 0; i < num; i++) {ptr[i] = 0;}}free(ptr);ptr = NULL; // 避免野指針return 0;
}

三、calloc 和 realloc

1. calloc

void* calloc(size_t num, size_t size);

· 為 num 個大小為 size 的元素開辟空間
· 并將每個字節初始化為 0
· 與 malloc 的區別:自動初始化

示例:

int* p = (int*)calloc(10, sizeof(int));
// 輸出:0 0 0 0 0 0 0 0 0 0

2. realloc

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

· 調整已開辟內存的大小
· ptr:原內存地址
· size:新大小
· 返回新內存起始地址

兩種情況:

  1. 原空間后方有足夠空間 → 直接擴展
  2. 原空間后方不足 → 另找空間,拷貝數據,釋放原空間

使用建議:

int* tmp = (int*)realloc(ptr, new_size);
if (tmp != NULL) {ptr = tmp;
} else {// 處理失敗
}

四、常見的動態內存錯誤

1. 對 NULL 解引用

int *p = (int*)malloc(INT_MAX/4);
*p = 20; // 可能崩潰

2. 越界訪問

for (i = 0; i <= 10; i++) {*(p + i) = i; // i=10 越界
}

3. 對非動態內存使用 free

int a = 10;
int *p = &a;
free(p); // 錯誤

4. 釋放部分動態內存

p++;
free(p); // p 不指向起始位置

5. 多次釋放同一塊內存

free(p);
free(p); // 重復釋放

6. 內存泄漏

void test() {int *p = (int*)malloc(100);// 忘記 free
}

五、動態內存經典題目分析

題目1:

void GetMemory(char *p) {p = (char*)malloc(100);
}
// 錯誤:傳值調用,str 仍為 NULL

題目2:

char* GetMemory() {char p[] = "hello world";return p; // 返回棧內存地址,危險!
}

題目3:

void GetMemory(char **p, int num) {*p = (char*)malloc(num);
}
// 正確:傳地址,可修改 str

題目4:

free(str);
if (str != NULL) { // str 已成為野指針strcpy(str, "world"); // 非法訪問
}

六、柔性數組(Flexible Array)

1.定義

struct st_type {int i;int a[]; // 或 int a[0];
};

2.特點

· 必須是結構最后一個成員
· sizeof 不包含柔性數組內存
· 需用 malloc 動態分配額外空間

使用:

type_a *p = malloc(sizeof(type_a) + 100 * sizeof(int));
p->i = 100;
for (int i = 0; i < 100; i++) {p->a[i] = i;
}
free(p);

3.優勢

· 一次分配、一次釋放
· 內存連續,訪問速度快,減少內存碎片


七、C/C++ 程序內存區域劃分

區域 內容說明
棧區(stack) 局部變量、函數參數、返回地址等,系統自動分配釋放
堆區(heap) 動態分配的內存,需手動管理
數據段(靜態區) 全局變量、靜態變量,程序結束釋放
代碼段 可執行代碼、只讀常量
內存映射段 文件映射、動態庫、匿名映射
內核空間 用戶代碼不可訪問


總結

· 動態內存管理使得程序在運行時能靈活申請和釋放內存
· 使用 malloc、calloc、realloc 申請,free 釋放
· 注意避免常見錯誤:空指針、越界、重復釋放、內存泄漏等
· 柔性數組適用于動態大小的結構體成員
· 理解內存區域劃分有助于更好地管理內存


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

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

相關文章

AI模型部署 - 大語言模型(LLM)部署技術與框架

目錄 一、 大語言模型部署的核心挑戰與關鍵技術 二、 主流開源部署框架深度解析 2.1. Ollama:本地部署的極簡主義者 2.2. Hugging Face TGI (Text Generation Inference) 2.3. vLLM:為吞吐量而生 2.4. sglang:面向復雜提示與結構化輸出的革新者 三、 特定硬件與云平臺…

Windows11 GeForce GTX 1060 CUDA+CUDNN+Pytorch 下載及安裝

一、查看顯卡型號信息 系統&#xff1a;Windows11 顯卡&#xff1a;GeForce GTX 1060 型號&#xff1a; &#xff08;1&#xff09;搜索 NVIDIA&#xff0c;選擇 NVIDIA Control Panel&#xff08;2&#xff09;打開 NVIDIA control Panel&#xff0c;打開系統信息&#xff0c;…

在通義靈碼中配置MCP服務

目錄 查找mcp列表 通義靈碼中配置MCP 使用方式 STDIO (Standard Input/Output) 組成部分&#xff1a; SSE (Server-Sent Events) 特點&#xff1a; 主要區別對比 配置方式 配置優先級 個人設置 項目設置 驗證 通過MCP調用高德地圖 查找mcp列表 打開ModelScope - …

網絡中的IO問題(五種常見的IO方式)

什么是高效的IO&#xff1f; 正常情況下&#xff0c;IO等拷貝 高效的IO拷貝&#xff08;即讓IO盡量不等&#xff09; 為什么我們平常玩電腦的時候&#xff0c;感覺不到等待的過程呢&#xff1f; 任何通信場景&#xff0c;IO通信場景&#xff0c;效率一定是有上限的. 花盆里&am…

JAVA核心基礎篇-修飾符

Java 修飾符主要用于定義類、方法或變量&#xff0c;通常放在語句的最前端&#xff0c;可分為訪問修飾符和非訪問修飾符兩類。一、訪問修飾符public&#xff1a;對所有類可見&#xff0c;可用于類、接口、變量和方法。被聲明為 public 的類、方法、構造方法和接口能夠被任何其他…

筆試——Day46

文章目錄第一題題目思路代碼第二題題目思路代碼第三題題目思路代碼第一題 題目 AOE還是單體&#xff1f; 思路 貪心 剩余怪物數量 >x時&#xff0c;使用AOE&#xff1b;否則使用單體 代碼 #include <iostream> #include <algorithm> using namespace std;…

零工合規挑戰:蓋雅以智能安全體系重構企業用工風控

國家稅務總局發布的2025年第15號公告&#xff0c;將多種互聯網平臺企業納入涉稅信息報送范圍&#xff0c;這讓靈活用工平臺的數據和網絡安全問題成為行業關注的焦點。在海量零工信息和企業數據流轉的過程中&#xff0c;數據泄露和網絡攻擊的風險不斷上升&#xff0c;迫使平臺在…

非線性規劃學習筆記

非線性規劃學習筆記 一、非線性規劃的應用 非線性規劃&#xff08;Nonlinear Programming, NLP&#xff09;在很多領域都有重要應用&#xff0c;主要包括&#xff1a; 工程設計優化&#xff1a;結構優化、電路參數優化、交通線路設計經濟與管理&#xff1a;投資組合優化、生產計…

網絡模型深度解析:CNI、Pod通信與NetworkPolicy

目錄 專欄介紹 作者與平臺 您將學到什么&#xff1f; 學習特色 網絡模型深度解析&#xff1a;CNI、Pod通信與NetworkPolicy 第一部分&#xff1a;CNI 插件原理 - 網絡基礎設施的構建者 1.1 CNI 規范&#xff1a;標準化網絡接入的基石 1.2 Flannel&#xff1a;簡單高效的…

數據結構青銅到王者第二話---數據結構基本常識(2)

續接上一話 一、包裝類 在Java中&#xff0c;由于基本類型不是繼承自Object&#xff0c;為了在泛型代碼中可以支持基本類型&#xff0c;Java給每個基本類型都對應了一個包裝類型。 1、基本數據類型和對應的包裝類 除了 Integer 和 Character&#xff0c; 其余基本類型的包裝類…

fastdds qos:DeadlineQosPolicy

1含義DeadlineQosPolicy這種qos使用在DataWriter、DataReader、Topic。該qos用來監督數據是不是按照預期的頻率進行收發。假如數據是周期性發送和接收&#xff0c;周期是固定的100ms&#xff0c;我們如果想要監督數據收發是不是按照預期的周期進行的&#xff0c;那么就可以配置…

QT-窗口類部件

Qt窗口類部件 一、窗口類部件 窗口就是沒有父部件的部件&#xff0c;所以又稱頂級部件。窗口類主要包括基本窗口類QWidget、對話框類QDialog和主窗口類QMainWindow三種。QObject是Qt框架中的一個核心基類&#xff0c;它提供了對象模型和信號槽機制。而QPaintDevice及其子類則提…

【CSP初賽】程序閱讀3

文章目錄前置知識閱讀程序判斷選擇答案解析判斷選擇總結前置知識 埃氏篩素數、C 基礎。 閱讀程序 #include <bits/stdc.h> using namespace std; int main(){int a1[51] {0};int i,j,t,t2,n 50;for(i 2;i<sqrt(n);i){if(a1[i] 0){t2 n/i;for(j 2;j<t2;j) …

【ESP32-IDF】高級外設開發4:SPI

系列文章目錄 持續更新中… 文章目錄系列文章目錄前言一、SPI概述1.主要功能2.SPI控制器架構3.SPI通信模式4.SPI數據幀與事務5.DMA與傳輸性能6.中斷與驅動事件二、SPI類型定義及相關API三、SPI示例程序總結前言 在嵌入式開發中&#xff0c;SPI&#xff08;串行外設接口&#…

遙感機器學習入門實戰教程|Sklearn案例⑧:評估指標(metrics)全解析

很多同學問&#xff1a;“模型好不好&#xff0c;怎么量化&#xff1f;” 本篇系統梳理 sklearn.metrics 中常用且“夠用”的多分類指標&#xff0c;并給出一段可直接運行的示例代碼&#xff0c;覆蓋&#xff1a;準確率、宏/微/加權 F1、Kappa、MCC、混淆矩陣&#xff08;計數/…

【Bluedroid】深入解析A2DP SBC編碼器初始化(a2dp_sbc_encoder_init)

SBC(Subband Coding)作為藍牙 A2DP 協議的標準編解碼器,其編碼器的初始化與參數配置直接影響音頻傳輸的音質、效率與兼容性。本文基于Andoird A2DP 協議棧源碼,系統剖析 SBC 編碼器的初始化流程,包括核心參數(比特池、采樣率、聲道模式等)的解析、計算與動態調整邏輯,以…

linux shell測試函數

在 C 語言中&#xff0c;int main(int argc, char *argv[])是程序的入口函數&#xff0c;而??在 main函數中調用專門的測試邏輯&#xff08;如測試函數&#xff09;??的程序結構&#xff0c;通常被稱為??測試程序&#xff08;Test Program&#xff09;??或??測試驅動…

【Java SE】抽象類、接口與Object類

文章目錄一、 抽象類&#xff08;Abstract Class&#xff09;1.1 什么是抽象類&#xff1f;1.2 抽象類的語法1.2.1 定義抽象類1.2.2 繼承抽象類1.3 抽象類的特性1.3.1 不能直接實例化1.3.2 抽象方法的限制1.3.3 抽象類可以包含構造方法1.3.4 抽象類不一定包含抽象方法1.3.5 抽象…

Autodl 創建新虛擬環境 python3.9

問題&#xff1a;本人在autodl上保存的環境因為很長時間沒有開機&#xff0c;autodl竟然給我刪除了。后來看了官網的介紹我才發現&#xff0c;原來15天不開機&#xff0c;autodl就會自動釋放實例。 因此&#xff0c;我就自己重新選了一個虛擬環境&#xff0c;從頭開始配置。 GP…

應急響應靶機-WindowsServer2022挖礦事件

依舊手癢開局&#xff0c;知攻善防實驗室的原創靶機 https://mp.weixin.qq.com/s/URrNHvQSnFKOyefHKXKjQQ 相關賬戶密碼&#xff1a; Administrator/zgsf123 注意&#xff1a;做個原始快照&#xff08;方便日后復習&#xff09;&#xff0c;安裝VMware tool&#xff08;安裝后圖…