【C語言】講解 程序分配的區域(新手)

目錄

代碼區

數據區

堆區?

?棧區

?常量區

重點比較一下堆區與?棧區?

總結:


?

前言:

C語言程序的內存分配區域是理解其運行機制的重要部分。根據提供的多條證據,我們可以總結出C語言程序在運行時主要涉及以下五個關鍵內存區域:?代碼區、?數據區?、?堆區?、?棧區??和?常量區。這些區域各自承擔不同的功能,。

那么本章節為大家講解定義,作用和特點。

堆區,棧區在動態內存的習題章節出現過,不知道大家是否還記得。

這個問題留的在最后,看完本章節,就兩字? 通透。

代碼區

  • 定義:代碼區存儲程序的機器代碼,即編譯后的二進制指令。這部分內存通常是只讀的,以防止程序意外修改自身的指令。
  • 作用:CPU在執行程序時,會從代碼區加載指令并依次運行。代碼區的內容在程序運行期間不會改變。

    查看

  • 特點:代碼區通常位于內存的低地址部分,操作系統負責加載和保護該區域

數據區

  • 定義:數據區分為已初始化數據區和未初始化數據區。已初始化數據區存儲全局變量和靜態變量,而未初始化數據區存儲全局未初始化變量。
  • 作用:存儲程序運行時需要保留的數據,包括全局變量和靜態變量。這些變量在整個程序運行期間都存在,并在程序結束時被釋放。
  • 特點:數據區是只讀或可讀寫的區域,具體取決于變量是否被初始化。

堆區?

  • 定義:堆區用于動態內存分配,程序員通過函數如malloccallocrealloc等分配內存空間,用于存儲運行時需要額外分配的變量。
  • 作用:動態分配的內存可以在程序運行過程中隨時調整大小或釋放。堆區的管理較為靈活,但如果不及時釋放可能導致內存泄漏。

    查看

  • 特點:堆區的內存分配方式類似于鏈表,分配和釋放較為復雜,且容易產生碎片

?棧區

  • 定義:棧區用于存儲函數調用時的局部變量、函數參數以及返回地址等信息。棧區由編譯器自動分配和釋放,通常在函數調用結束后立即釋放。
  • 作用:棧區主要用于存放生命周期較短的變量,如局部變量和形參。它支持快速分配和釋放,因此非常適合處理短期數據。
  • 特點:棧區的內存分配方式類似于數據結構中的棧,遵循“先進后出”的原則。棧區的大小通常較小且連續,但其容量有限,如果過度使用可能導致棧溢出。

?常量區

  • 定義:常量區存儲程序中定義的字符串常量和其他只讀數據。
  • 作用:常量區中的數據通常是只讀的,例如字符串字面量或符號常量。這些數據在程序運行期間不會被修改。
  • 特點:常量區的數據通常位于內存的高地址部分,且在程序結束時不會被釋放。

重點比較一下堆區與?棧區?

存儲內容不同

棧:在函數調用時,棧中存放的是函數中各個參數(局部變量)。棧底下是函數調用后的下一條指令。

堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。

管理方式上不同

棧:由系統自動分配空間,同時系統自動釋放空間。例如,聲明在函數中一個局部變量“int b“。系統自動在棧中為b開辟空間,當對應的生存周期結束后棧空間自動釋放。

堆:需要程序員手動申請并且手動釋放,并指明大小。在C語言中malloc函數申請,釋放free函數,在C++中new和delete實現。

空間大小不同

棧:獲取空間較小。在Windows下,一般大小是1M或2M,當剩余棧空間不足時,分配失敗overflow。

堆:獲得空間根據系統的有效虛擬內存有關,比較靈活,比較大。

能否產生碎片不同

棧:不會產生碎片,空間連續。

堆:采用的是鏈表的存儲方式,會產生碎片。

生長方向不同

棧:向低地址擴展的數據結構,是一塊連續的內存的區域。

堆:向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。

分配方式不同

棧:有2種分配方式——靜態分配和動態分配。靜態由編譯器完成,例如局部變量;動態由alloca函數實現,并且編譯器會進行釋放。

堆:都是動態分配的,沒有靜態分配的堆。

分配效率不同

棧:由系統自動分配,速度較快。但程序員是無法控制的。

堆:由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來方便。

總結:

1.棧:用來存放函數的形參和函數內的局部變量。由編譯器分配空間,在函數執行完后由編譯器自動釋放。


2.堆:用來存放由動態分配函數(如malloc)分配的空間。是由程序員自己手動分配的,并且必須由程序員使用free釋放。如果忘記用free釋放,會導致所分配的空間一直占著不放,導致內存泄露。


3.全局區/靜態區:用來存放全局變量和靜態變量。程序結束時由系統釋放,分為全局初始化區和全局未初始化區;存在于程序的整個運行期間,是由編譯器分配和釋放的。


4.常量區:常量字符串放于此,程序結束時由系統釋放。例如char *str=”hello_world”;則”hello_world”為文字常量,存放于文字常量區。也由編譯器控制分配和釋放。


5.代碼區:用來存放程序的二進制代碼。

提供一個代碼,供大家理解?

#include <stdlib.h>
#include <string.h>int a = 0; char *p1;
int main()
{int b; //棧char arr[] = "abc"; char *p2; //棧char *p3 = "123456"; static int c =0; p1 = (char *)malloc(10); p2 = (char *)malloc(20); strcpy(p1, "123456"); return 0;
}

?答案如下:

#include <stdlib.h>
#include <string.h>int a = 0; //全局初始化區char *p1; //全局未初始化區int main()
{int b; //棧char arr[] = "abc"; //  arr在棧,"abc\0"在常量區char *p2; //棧char *p3 = "123456"; //  "123456\0"在常量區,p3在棧上static int c =0; //全局區p1 = (char *)malloc(10); //p1在棧,分配的10字節在堆p2 = (char *)malloc(20); //p2在棧,分配的20字節在堆strcpy(p1, "123456"); //"123456"放在常量區,編譯器可能會優化為和p3的指向同一塊區域return 0;
}

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

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

相關文章

Go語言之接口與多態 -《Go語言實戰指南》

接口是 Go 語言實現 多態 的核心機制。本章將幫助你理解接口的設計哲學、動態行為&#xff0c;以及它如何讓 Go 實現面向接口編程的能力。 一、什么是接口&#xff1f; 接口是一組方法簽名的集合&#xff0c;任何類型只要實現了接口中聲明的所有方法&#xff0c;就被視為實現了…

JSR 303(即 Bean Validation)是一個通過??注解在 Java Bean 上定義和執行驗證規則??的規范

&#x1f6e0;? 一、JSR 303是什么&#xff1f; JSR 303&#xff08;Java Specification Requests 303&#xff09;是Java EE 6的子規范&#xff0c;全稱??Bean Validation??。它通過注解方式對JavaBean的屬性值進行標準化校驗&#xff0c;例如檢查非空、長度、格式等規則…

【圖像處理入門】3. 幾何變換基礎:從平移旋轉到插值魔法

摘要 掌握圖像的幾何變換相當于學會「圖像的空間魔法」。本文將帶你理解平移/旋轉/縮放的數學原理&#xff0c;掌握OpenCV中warpAffine和getAffineTransform的核心用法&#xff0c;對比最近鄰、雙線性等插值算法的優劣。通過圖像翻轉、鏡像、透視變換實戰&#xff0c;學會用變…

微信小程序學習目錄

個人簡介 &#x1f468;?&#x1f4bb;?個人主頁&#xff1a; 魔術師 &#x1f4d6;學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全棧發展 &#x1f6b4;個人狀態&#xff1a; 研發工程師&#xff0c;現效力于政務服務網事業 &#x1f1e8;&#x1f1f3;人生格言&…

QT 5.15.2 程序中文亂碼

1. 在.pro文件中添加&#xff1a; msvc { QMAKE_CXXFLAGS /source-charset:utf-8 /execution-charset:utf-8 }備注&#xff1a;.pro文件只有在選擇 qmake 方式才會生成。 [Cmake 只會生成 CMakeLists.txt 文件] 2. 在文件首部增加以下程序行 #pragma execution_character_s…

Unity UI設計優化與模式原則

前言 在 Unity 中設計高效且可維護的 UI 系統時&#xff0c;需要結合性能優化和設計模式兩大核心方向。以下是關鍵原則及實踐方法&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀&#xff01; 一、UI 性能…

CppCon 2014 學習: The Implementation of Value Types

“The Implementation of Value Types” 在C里&#xff0c;通常指的是如何設計和實現**值類型&#xff08;value types&#xff09;**的類&#xff0c;確保它們符合值語義&#xff08;value semantics&#xff09;&#xff0c;也就是說&#xff1a; 對象的賦值和拷貝操作應該是…

每日算法刷題Day19 5.31:leetcode二分答案3道題,用時1h

6. 475.供暖器(中等&#xff0c;學習check函數雙指針思想) 475. 供暖器 - 力扣&#xff08;LeetCode&#xff09; 思想 1.冬季已經來臨。 你的任務是設計一個有固定加熱半徑的供暖器向所有房屋供暖。在加熱器的加熱半徑范圍內的每個房屋都可以獲得供暖。現在&#xff0c;給出…

【計算機網絡】第2章:應用層—應用層協議原理

目錄 1. 網絡應用的體系結構 2. 客戶-服務器&#xff08;C/S&#xff09;體系結構 3. 對等體&#xff08;P2P&#xff09;體系結構 4. C/S 和 P2P 體系結構的混合體 Napster 即時通信 5. 進程通信 6. 分布式進程通信需要解決的問題 7. 問題1&#xff1a;對進程進行編址…

PHP+MySQL開發語言 在線下單訂水送水小程序源碼及搭建指南

隨著互聯網技術的不斷發展&#xff0c;在線下單訂水送水服務為人們所需要。分享一款 PHP 和 MySQL 搭建一個功能完善的在線訂水送水小程序源碼及搭建教程。這個系統將包含用戶端和管理端兩部分&#xff0c;用戶可以在線下單、查詢訂單狀態&#xff0c;管理員可以處理訂單、管理…

vBulletin未認證API方法調用漏洞(CVE-2025-48827)

免責聲明 本文檔所述漏洞詳情及復現方法僅限用于合法授權的安全研究和學術教育用途。任何個人或組織不得利用本文內容從事未經許可的滲透測試、網絡攻擊或其他違法行為。使用者應確保其行為符合相關法律法規,并取得目標系統的明確授權。 對于因不當使用本文信息而造成的任何直…

計算機模擬分子合成有哪些應用軟件?

參閱&#xff1a;Top 創新大獎 以下是用于計算機模擬分子合成&#xff08;包括逆合成設計、分子對接、分子動力學模擬及綜合設計平臺&#xff09;的主流應用軟件分類總結&#xff0c;結合其核心功能和應用場景進行整理&#xff1a; &#x1f52c; 一、逆合成設計與路線規劃軟件…

Excel 中的SUMIFS用法(基礎版),重復項求和

1. 首先復制篩選條件所在的列&#xff0c;去除重復項目 數據 》重復項 》刪除重復項 2. 輸入函數公式 SUMIFS(C:C,A:A,E2) 3. 選中單元格&#xff0c;通過 ShiftF3 查看函數參數 第一個參數&#xff1a;求和區域&#xff0c;要累加的值所在的區域范圍 第二個參數&#xff1a…

【xmb】內部文檔148344597

基于小米CyberDog 2的自主導航與視覺感知系統設計報告 摘要&#xff1a; 本文針對2025年全國大學生計算機系統能力大賽智能系統創新設計賽&#xff08;小米杯&#xff09;初賽要求&#xff0c;設計并實現了基于小米仿生四足機器人CyberDog 2的平臺系統方案。參賽作品利用Cyber…

從零開始理解機器學習:知識體系 + 核心術語詳解

你可能聽說過“機器學習”&#xff0c;覺得它很神秘&#xff0c;像是讓電腦自己學會做事。其實&#xff0c;機器學習的本質很簡單&#xff1a;通過數據來自動建立規則&#xff0c;從而完成預測或決策任務。 這篇文章將帶你系統梳理機器學習的知識體系&#xff0c;并用貼近生活…

springboot集成websocket給前端推送消息

一般通常情況下&#xff0c;我們都是前端主動朝后端發送請求&#xff0c;那么有沒有可能&#xff0c;后端主動給前端推送消息呢&#xff1f;這時候就可以借助websocket來實現。下面給出一個簡單的實現樣例。 首先創建一個websocketDemo工程&#xff0c;該工程的整體結構如下&a…

【清晰教程】查看和修改Git配置情況

目錄 查看安裝版本 查看特定配置 查看全局配置 查看本地倉庫配置 設置或修改配置 查看安裝版本 打開命令行工具&#xff0c;通過version命令檢查Git版本號。 git --version 如果顯示出 Git 的版本號&#xff0c;說明 Git 已經成功安裝。 查看特定配置 如果想要查看特定…

【Github/Gitee Webhook觸發自動部署-Jenkins】

Github/Gitee Webhook觸發自動部署-Jenkins #mermaid-svg-hRyAcESlyk5R2rDn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hRyAcESlyk5R2rDn .error-icon{fill:#552222;}#mermaid-svg-hRyAcESlyk5R2rDn .error-tex…

C語言數據結構-鏈式棧

頭文件&#xff1a;stack.h #ifndef __STACK_H__ #define __STACK_H__ #include <stdio.h> #include <stdlib.h> typedef int DataType; /* 鏈式棧節點類型 */ typedef struct staNode { DataType data; struct staNode *pNext; }StackNode; /* 鏈式棧…

M4Pro安裝ELK(ElasticSearch+LogStash+Kibana)踩坑記錄

ElasticSearch安裝&#xff0c;啟動端口9200&#xff1a; docker pull elasticsearch:8.13.0 新增配置文件elasticsearch.yml&#xff1a; cd /opt/homebrew/etc/ mkdir elasticsearch_config cd elasticsearch_config vi elasticsearch.yml cluster.name: "nfturbo…