日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  先看幾個概念:

1、bss是英文block started by symbol的簡稱,通常是指用來存放程序中未初始化的全局變量的一塊內存區域,在程序載入時由內核清0。bss段屬于靜態內存分配。它的初始值也是由用戶自己定義的連接定位文件所確定,用戶應該將它定義在可讀寫的ram區內,源程序中使用malloc分配的內存就是這一塊,它不是根據data大小確定,主要由程序中同時分配內存最大值所確定,不過如果超出了范圍,也就是分配失敗,可以等空間釋放之后再分配。

?2、text段是程序代碼段,在at91庫中是表示程序段的大小,它是由編譯器在編譯連接時自動計算的,當你在鏈接定位文件中將該符號放置在代碼段后,那么該符號表示的值就是代碼段大小,編譯連接時,該符號所代表的值會自動代入到源程序中。

?3、data包含靜態初始化的數據,所以有初值的全局變量和static變量在data區。段的起始位置也是由連接定位文件所確定,大小在編譯連接時自動分配,它和你的程序大小沒有關系,但和程序使用到的全局變量,常量數量相關。

?4、stack保存函數的局部變量和參數。是一種“后進先出”(last in first out,lifo)的數據結構,這意味著最后放到棧上的數據,將會是第一個從棧上移走的數據。對于哪些暫時存貯的信息,和不需要長時間保存的信息來說,lifo這種數據結構非常理想。在調用函數或過程后,系統通常會清除棧上保存的局部變量、函數調用信息及其它的信息。棧另外一個重要的特征是,它的地址空間“向下減少”,即當棧上保存的數據越多,棧的地址就越低。棧(stack)的頂部在可讀寫的ram區的最后。?

?5、heap保存函數內部動態分配內存,是另外一種用來保存程序信息的數據結構,更準確的說是保存程序的動態變量。堆是“先進先出”(first in first out,fifo)數據結構。它只允許在堆的一端插入數據,在另一端移走數據。堆的地址空間“向上增加”,即當堆上保存的數據越多,堆的地址就越高。

  遇到的問題:

  以前這些我都記得,今天遇到實際問題時候,發現遠遠不是這回事,全局變量能放在text段嗎?

的確可以的,其實,我今天就遇到了這種情況,這個配置的區域實際上是可以在link文件中修改的,假如我的link文件是這樣子的:

  其實,這種情況下,假如我定義個const 類型的全局變量,該全局變量就會在text段了,看來,計算的的東西,還是要理解原理才行啊.不過,這個也是反復的過程,有誰不經過磨難,就能快速成長呢?

轉載于:https://www.cnblogs.com/dylancao/p/9936957.html

總結

以上是生活随笔為你收集整理的C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。