關於變數的記憶體分配 牛客網錯題整理

2021-07-14 13:21:48 字數 1443 閱讀 6206

錯題1:

int a=0;

class someclass

int b;

static int c;

int main()、

int d=0;

someclass *p=new someclass();

return 0;

解析1、棧區(stack)— 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數、函式引數、返回資料、返回位址等。

2、堆區(heap) —一般由程式設計師分配釋放,new, malloc之類的,若程式設計師不釋放,程式結束時可能由os** 。

3、全域性區(靜態區)(static)— 存放全域性變數、靜態資料、常量。程式結束後由系統釋放。

4、文字常量區— 常量字串就是放在這裡的。程式結束後由系統釋放。

5、程式**區— 存放函式體(類成員函式和全域性函式)的二進位制**。

a,全域性變數,全域性區;

b,成員變數,堆區;(我是這樣理解的,因為物件要申請,會放在堆區,所以類的成員也就是放在堆區)

c,靜態變數,靜態區;

d,方法變數,棧區;

p,方法變數,棧區,指向堆區的物件。

錯題2:在linux 系統中,在執行乙個程式時,程式中未初始化的全域性變數會被載入到以下哪個記憶體段中?

存放在bbs中

解析bss(block started by symbol)通常是指用來存放程式中未初始化的全域性變數和靜態變數的一塊記憶體區域。特點是:可讀寫的,在程式執行之前bss段會自動清0。所以,未初始的全域性變數在程式執行之前已經成0了。

資料段:資料段(datasegment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。  

**段:**段(codesegment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。  

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫

malloc

等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)  

棧(stack):棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「

{}」中定義的變數(但不包括

static

宣告的變數,

static

意味著在資料段中存放變數 所以在錯題一中 static 宣告的c變數是存放在靜態區的而不是存在棧中)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區

關於c語言的變數儲存及記憶體分配

在計算機裡面,cpu與磁碟 硬碟 是不直接發生資料交換的,因為cpu處理資料的速度遠大於磁碟的速度,因此,在cpu與磁碟之間就有了記憶體這東西的出現,記憶體就是起著乙個緩衝的作用,當執行程式的時候,首先的從磁碟把程式載入到記憶體,然後cpu才能從記憶體裡面取指令以及傳輸資料。但是記憶體是掉電之後裡面...

關於C語言變數記憶體分配一些自己的理解。

以下僅僅是自己通過看書後的,自己的一些理解,有什麼問題歡迎指出。首先說下記憶體,什麼是記憶體,什麼是位址?打個比方,把記憶體比作一棟樓,這棟樓裡面有很多房間,每個房間都有標號。那麼,每個房間裡面的空間就是我們存放東西的地方,房間的標號就是我麼所說的位址。如果我們想要在這棟樓拿出乙個東西,那麼得首先知...

針對牛客網刷題關於重複字串處理的問題

問題 存在重複字串,把其中重複字串只輸出乙個,計算總共字元數量 解決辦法1 使用stl演算法進行處理unique erase這種方式解決 記得加上標頭檔案 include include include include include using namespace std int main sor...