0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C程序中??臻g的使用

單片機匠人 ? 來源:單片機匠人 ? 作者:單片機匠人 ? 2022-04-19 14:41 ? 次閱讀

C語言程序中,??臻g是由編譯器管理的,在程序中可以體現(xiàn)??臻g使用的例子是參數(shù)的傳遞、返回值的使用以及自動變量的空間。

在運行程序的系統(tǒng)中,棧空間是從高地址向低地址增長的。在程序的執(zhí)行結(jié)果中打印參數(shù)的地址就可以看到參數(shù)地址的關(guān)系。

參數(shù)入棧的順序是:后面的參數(shù)在高地址處,前面的參數(shù)在低地址處。事實上,進(jìn)入函數(shù)后,第一個參數(shù)將位于??臻g的最后。因此,程序在按照順序訪問參數(shù)的時候,還是從低地址到高地址的訪問。注意:具體參數(shù)將占用多大的棧區(qū)域空間,將由編譯器決定,因為入棧之前的棧指針和入棧之后的棧指針之間的內(nèi)容不一定和參數(shù)大小的和一致。

在函數(shù)退出之后,棧指針將返回到函數(shù)進(jìn)入之前的位置。從上面我們得出,在函數(shù)調(diào)用的過程中,每增加一個層次,都會讓程序需要更大的??臻g。

事實上,在函數(shù)的調(diào)用過程中,參數(shù)和返回值都將使用??臻g。棧空間的具體規(guī)模是和編譯器有關(guān)系的,可以確定的一點是:一般參數(shù)入棧后,前面的參數(shù)將位于內(nèi)存的低地址,后面的參數(shù)將位于內(nèi)存的高地址。

在程序中,函數(shù)內(nèi)部使用的自動變量也是保存在棧區(qū)域的。編譯器在處理自動變量的時候,將在參數(shù)棧區(qū)的后面為自動變量分配棧區(qū)域。棧的開辟順序和參數(shù)的順序是一致的。

編譯器只會為函數(shù)內(nèi)部的自動變量在棧上開辟空間,如果函數(shù)內(nèi)部的變量改為靜態(tài)變量,這個時候編譯器就不會為這個變量在棧上開辟空間了,而是將它放入靜態(tài)的存儲區(qū)內(nèi)。

程序中使用的自動局部變量和參數(shù)的類型都是C語言的基本類型,在32位的系統(tǒng)中,int為32位(4字節(jié)),這種變量類型將占用4個字節(jié)的??臻g。在程序中,可能使用較大的??臻g的變量類型是結(jié)構(gòu)體和數(shù)組。

關(guān)于??臻g的使用,完全是由編譯器來處理的,在程序中不需要管理棧。當(dāng)函數(shù)退出之后,函數(shù)棧上的內(nèi)容將被釋放,因此,在函數(shù)跳出后,函數(shù)棧上的內(nèi)容是不能被別的函數(shù)使用的。

內(nèi)層函數(shù)可以使用外層函數(shù)的棧內(nèi)存,但是外層函數(shù)不能使用內(nèi)層函數(shù)的棧內(nèi)存。

自動變量的地址不可以作為函數(shù)返回值,但是可以作為參數(shù)傳遞給其他函數(shù)。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49015
  • C程序
    +關(guān)注

    關(guān)注

    4

    文章

    254

    瀏覽量

    35967

原文標(biāo)題:C程序中棧空間的使用

文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    簡述大前端技術(shù)的渲染原理

    應(yīng)用開發(fā):Android、iOS、鴻蒙(HarmonyOS)等; ?Web前端框架:Vue、React、Angular等; ?小程序開發(fā):微信小程序、京東小程序、支付寶小程序等; ?跨
    的頭像 發(fā)表于 11-07 10:11 ?91次閱讀

    Linux網(wǎng)絡(luò)協(xié)議的實現(xiàn)

    網(wǎng)絡(luò)協(xié)議是操作系統(tǒng)核心的一個重要組成部分,負(fù)責(zé)管理網(wǎng)絡(luò)通信中的數(shù)據(jù)包處理。在 Linux 操作系統(tǒng),網(wǎng)絡(luò)協(xié)議(Network Stack)負(fù)責(zé)實現(xiàn) TCP/IP 協(xié)議簇,處理應(yīng)用程序
    的頭像 發(fā)表于 09-10 09:51 ?235次閱讀
    Linux網(wǎng)絡(luò)協(xié)議<b class='flag-5'>棧</b>的實現(xiàn)

    linux驅(qū)動程序運行在什么空間

    Linux 驅(qū)動程序是操作系統(tǒng)的一部分,負(fù)責(zé)管理硬件設(shè)備與操作系統(tǒng)之間的交互。驅(qū)動程序運行在內(nèi)核空間(Kernel Space),這是操作系統(tǒng)的核心部分,與用戶空間(User Spac
    的頭像 發(fā)表于 08-30 14:37 ?278次閱讀

    請問FW OTA二進(jìn)制文件是否包含應(yīng)用程序和BT/程序庫?

    你好,先生: 因為英飛凌仍在不斷更新 BT 和庫。 那么 如果客戶在第一個版本中有 OTA 功能。 FW OTA 二進(jìn)制文件是否包含應(yīng)用程序和 BT /程序庫?
    發(fā)表于 05-20 07:28

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時候才會出現(xiàn),內(nèi)存不存在內(nèi)存泄漏問題,因為內(nèi)存會自動分配和釋放。C語言代碼堆內(nèi)存的申請函數(shù)是malloc。
    發(fā)表于 03-19 11:38 ?443次閱讀
    <b class='flag-5'>C</b>語言內(nèi)存泄漏問題原理

    基于嵌入式OS的LwIP協(xié)議

    設(shè)計通信協(xié)議程序,需要具備內(nèi)存管理、任務(wù)管理、進(jìn)程間通信、信號量、時鐘、定時處理等功能,從頭開始難度巨大,而且容易出錯。
    發(fā)表于 02-03 16:19 ?751次閱讀
    基于嵌入式OS的LwIP協(xié)議<b class='flag-5'>棧</b>

    堆和的區(qū)別和使用注意事項

    堆和是在計算機科學(xué)中廣泛使用的兩種數(shù)據(jù)結(jié)構(gòu),它們具有不同的用途和特點。堆和的區(qū)別涉及到內(nèi)存分配、訪問方式、數(shù)據(jù)存儲等方面。在使用堆和時,還需要注意一些細(xì)節(jié),以確保程序的正確性和效
    的頭像 發(fā)表于 01-18 17:24 ?2013次閱讀

    java虛擬機內(nèi)存包括遠(yuǎn)空間內(nèi)存嗎

    Java虛擬機(JVM)內(nèi)存是Java程序執(zhí)行時所使用的內(nèi)存空間的總稱,包括了Java堆、方法區(qū)、本地方法、虛擬機程序計數(shù)器等多個部分
    的頭像 發(fā)表于 12-05 14:15 ?366次閱讀

    運行c程序的基本步驟

    運行C程序的基本步驟可以分為以下四個主要步驟:編寫程序、編譯程序、鏈接程序和運行程序。本文將詳細(xì)
    的頭像 發(fā)表于 11-27 16:21 ?5291次閱讀

    c程序的運行環(huán)境和運行c程序的方法

    C語言是一種通用的、高效的編程語言,被廣泛用于系統(tǒng)開發(fā)、嵌入式設(shè)備以及科學(xué)計算等領(lǐng)域。為了正確運行C程序,我們需要了解C程序的運行環(huán)境,并掌
    的頭像 發(fā)表于 11-27 16:00 ?1954次閱讀

    c程序的基本結(jié)構(gòu)是什么

    C語言源程序的基本結(jié)構(gòu)是由多個函數(shù)組成的。每個程序至少包含一個主函數(shù),也可以包含其他的函數(shù),而這些函數(shù)相互之間可以進(jìn)行相互調(diào)用,以完成特定的任務(wù)。 一、頭文件部分 在一個C語言源
    的頭像 發(fā)表于 11-24 10:24 ?2128次閱讀

    c語言源程序main函數(shù)的位置

    C語言源程序的main函數(shù)是程序的入口點,它被認(rèn)為是C語言程序的起點。在執(zhí)行
    的頭像 發(fā)表于 11-24 10:23 ?2255次閱讀

    c語言源程序的基本單位

    個或多個函數(shù)組成。每個函數(shù)都有一個函數(shù)名和一對大括號{},大括號是函數(shù)的代碼塊。函數(shù)可以接受一些參數(shù),并且可以返回一個值。函數(shù)的代碼塊包含了一系列的語句,這些語句定義了函數(shù)的功能和行為。 一個典型的C語言源
    的頭像 發(fā)表于 11-24 10:20 ?1502次閱讀

    如何查看java程序的內(nèi)存分布

    。 程序計數(shù)器: 程序計數(shù)器是一塊較小的內(nèi)存空間,它的作用是指示當(dāng)前線程所執(zhí)行的字節(jié)碼指令的行號。在多線程環(huán)境下,每個線程都有一個獨立的程序計數(shù)器,用于記錄當(dāng)前線程執(zhí)行的字節(jié)碼指令。
    的頭像 發(fā)表于 11-23 14:47 ?987次閱讀

    程序內(nèi)存分區(qū)的堆與

    表示兩種內(nèi)存管理方式; (2)數(shù)據(jù)結(jié)構(gòu)場景下,堆與表示兩種常用的數(shù)據(jù)結(jié)構(gòu)。 1.程序內(nèi)存分區(qū)的堆與 1.1
    的頭像 發(fā)表于 11-11 16:21 ?715次閱讀
    <b class='flag-5'>程序</b>內(nèi)存分區(qū)<b class='flag-5'>中</b>的堆與<b class='flag-5'>棧</b>