程式的記憶體空間申請是在什麼時候呢?

2023-03-06 13:35:02 字數 5573 閱讀 3407

1樓:匿名使用者

系統引導程式時就已經靜態分配了程式本身佔用和靜態資料佔用的空間,程式執行期間存在兩種方式的動態記憶體管理,就是棧和堆。每呼叫一次函式,函式中的區域性變數就會導致棧的增長,函式退出時棧又回退,堆空間的申請和釋放就完全由程式設計師寫的**控制了。

2樓:

包括棧記憶體空間申請和堆記憶體空間申請。

在我所知道的:c的棧記憶體要申請完所有的之後才能用,不能在程式過程中申請,如:

int x, int y, int z;

int main()

c++就可能了,你可以在需要時申請:

int main()

堆上記憶體c、c++都一樣,只要記憶體有足夠的空間,你可在任何地方申請,不過要及時銷毀物件和登出空間。

3樓:手機使用者

還沒有執行怎麼s會佔用內7存呢?!(這一m點還要懷疑嗎!?)所謂在編譯期間分6配空間指的是靜態分5配空間(相對於a用new動態申請空間),如全域性變數或靜態變數(包括一d些複雜型別的常量),它們所需要的空間大w小q可以6明確計7算出來,並且不p會再改變,因此它們可以8直接存放在可執行文6件的特定的節裡(而且包含初始化2的值),程式執行時也d是直接將這個i節載入到特定的段中5,不w必在程式執行期間用額外的**來產生這些變數。

其實在執行期間再看「變數」這個v概念就不y再具備編譯期間那麼f多的屬性了n(諸如名稱,型別,作用域,生存期等等),對應的只是一n塊內1存(只有首址和大w小r),所以8在執行期間動態申請的空間,是需要額外的**維護,以4確保不w同變數不k會混用內0存。比4如寫new表示1有一b塊內4存已k經被佔用了g,其它變數就不v能再用它了b; 寫delete表示0這塊內7存自由了o,可以0被其它變數使用了m。(通常我們都是通過變數來使用內5存的,就編碼而言變數是給內5存塊起了a個r名字,用以6區z分1彼此) 內7存申請和釋放時機很重要,過早會丟失資料,過遲會耗費內0存。

特定情況下z編譯器可以4幫我們完成這項複雜的工c作(增加額外的**維護內0存空間,實現申請和釋放)。從8這個d意義p上z講,區域性自動變數也m是由編譯器負責分4配空間的。進一k步講,內1存管理用到了o我們常常掛在嘴邊的堆和棧這兩種資料結構。

最後對於r「編譯器分1配空間」這種不j嚴謹的說法,你可以4理解成編譯期間它為5你規劃好了q這些變數的內0存使用方7案,這個c方0案寫到可執行文1件裡面了x(該文1件中3包含若干s並非出自你大w腦衍生的**),直到程式執行時才j真正拿出來執行!

oтmㄍ〃ndtⅹh鼎獺g┳h鼎獺mㄍ〃p啷。

c語言什麼時候向系統要記憶體空間?怎麼表示?

4樓:匿名使用者

如果乙個執行時動態大小不定的變數,可能需要向系統堆記憶體要空間,用malloc函式。

5樓:網友

有幾種情況。

1、程式即將開始,預編譯階段,發現有全域性或靜態變數的時候。

2、進入函式,並且定義乙個區域性變數的時候。

3、程式設計師動態申請記憶體的時候。

4、容器型別自增長的時候。

大概就這幾個情況。需要程式設計師關心的只有自己動態申請記憶體,需要手動釋放。

c++中什麼時候需要申請動態空間?

6樓:匿名使用者

申請的陣列太長,這時動態申請較好。

7樓:伶仃乞丐

必須申請動態空間才能解決問題的時候。

c++中 int* a=new int; 這樣寫程式時,是已經申請了記憶體空間嗎?如果是,那麼申請了多大的記憶體空間?

8樓:匿名使用者

是的,申請的就是乙個 int 整數的空間,4位元組。

9樓:碧血玉葉花

先說下那三條語句。

int *a=new int(120);

申請乙個整型變數空間,賦初值為120,並定義乙個整型指標a指向該位址空間。

int *a=new int[120];

申請120個整型變數空間,沒有賦初值,並定義乙個整型指標a指向該位址空間開始處。

int *a=new int(n);

申請乙個整型變數空間,賦初值為n,並定義乙個整型指標a指向該位址空間。

對於(1)(3)語句,肯定陣列越界了。

c語言編譯器不會自己檢查陣列越界的,要靠程式設計師自己注意。

如果越界,一般來說同樣可以修改、訪問,所以你的程式輸出結果不變。

但是要知道:越界部分是別的部分的資料甚至**,修改、訪問可能導致程式錯誤。

c語言,什麼時候需要開闢空間

10樓:匿名使用者

對於想要學好c的程式設計師來說,了解程式執行的儲存空間布局是非常有必要的。

c執行的儲存空間布局有很多種,不同的作業系統可能存在一些細節的差異,這裡只介紹概念,比較細節的部分你有時間可以自己查閱資料。

**段:由編譯生成的機器碼組成。

唯讀資料段:儲存**中不被修改的資料,比如**中定義的一些常量。

可讀寫資料段(已分配初始值):一般用來儲存**中的全域性/靜態變數,由於賦予了初始值,所以需要記錄其初始值。

可讀寫資料段(未分配初始值):一般用來儲存**中的全域性/靜態變數,由於沒有記錄初始值,則無需記錄,由系統統一賦值(不同系統有差異,一般變數統一是 0,而指標為null)

堆(heap):**執行過程中由malloc 出來的空間,特點是需要程式通過malloc等執行分配除任意長度的記憶體空間,也必須使用free等指令釋放空間,否則會出現記憶體洩露。

·優點:由於記憶體的分配是根據具體的需求來定義的,不再使用時再手動釋放,所以,記憶體使用率可以自由控制,避免了記憶體的浪費。

·缺點:分配和釋放本身是需要耗系統資源的,而且需要程式設計師清除的知道釋放的時間點,增加了程式設計的難度,也可能因為忘記釋放記憶體導致記憶體洩露。

棧(stack):典型的使用是函式呼叫過程中產生的變數,比如在函式中定義乙個變數、陣列都是從棧中由系統自動分配的空間,退出函式時由系統自動釋放。

·優點:系統自動分配、釋放,操作方便、分配/釋放記憶體效率高,不存在記憶體洩露。

·缺點:需要為每個執行緒分配一塊固定大小的記憶體區域,記憶體使用效率低,因為你並不知道執行時需要多大記憶體,所以必須分配足夠大的記憶體空間、避免記憶體溢位。

陣列、變數、資料結構即可以在堆(heap)中分配,也可以在棧(stack)中分配,一般在棧中分配就能滿足需求就盡量使用棧,而有的記憶體空間就必須使用堆來分配才能滿足需求,具體情況具體分析。

11樓:

其實寫乙個函式,開頭的宣告變數或陣列就是在開闢空間,所以只要寫**,開闢空間的事肯定就少不了。但你這裡說的我想應該是指「動態開闢空間」。動態開闢空間一般在以下情況下進行:

程式設計時不知道需要多大的空間,要在程式執行時由使用者輸入大小或計算出所需大小;

一些資料量太大,棧區放不下,需要建立在堆裡;

由於某需要要求**這樣寫。

大致就這些情況。

12樓:匿名使用者

一般是資料儲存有隨機、臨時、不等長這些情況下需要:

-當需要根據程式即時執行結果開設相應尺寸陣列時。比如開啟影象檔案讀取影象尺寸後再開闢空間儲存影象。

-臨時使用陣列,但又不想佔用棧空間時。這樣操作比用棧空間申請(函式中開陣列)訪問快、避免棧溢位、靈活,可適用大量零碎的、臨時的不等長陣列開設及使用。

-類中需要比較大的動態記憶體保留資料時。有些類的設計中根據狀態不同資料區是靈活改變的,這樣避免記憶體浪費,比如cstring類,在沒有儲存字串資料時,其字串佔用空間為0,而儲存字串後,佔用空間根據具體字串長度隨時可調整。

13樓:匿名使用者

你應該是指malloc的練習吧,這確實是很容易困擾初學者的問題。

前面幾位講得很全面,但可能不夠直觀。我給你舉例說明一下。

以你在編寫程式時並不知道你需要多大的空間而需要用到malloc的這種情況為例。

比如說:你知道自己需要用固定需要用1000位元組時,你可以使用char a[1000]這樣的陣列來存放著1000位元組,但是如果你事先不知道自己需要多大的記憶體,如編寫 乙個程式從硬碟中讀取n個位元組,其中n由使用者自己輸入,此時你就需要使用malloc來在記憶體中分配n個位元組來儲存硬碟中讀出來的n個位元組了。

14樓:阿桃超兇的

一 堆中存放具體資料 棧中存放你所命名的變數名字。

二 既然叫匿名函式 自然沒有名字 所以這就是在堆裡有具體資料 而棧中沒有名字指向這個資料的意思。

c++中物件的記憶體空間是在什麼時候被分配的

15樓:網友

以上拙見,希望能對你有所幫助。

16樓:匿名使用者

那為什麼這個程式是對的?

#include

using namespace std;

int main( )

else}

17樓:匿名使用者

c++允許在程式的內部申請變數,並不意味著可以在任何地方。具體的說,就是不允許在程式有分支的地方申請,比如if(a>b) int a;

至於類,如果學過c,就明白,其實只是有函式的結構體。他內部的變數空間,也是像普通變數一樣申請的如上例中的int。

事實上,c++在這方面,只不過更人性化設計,對程式本身對多大的改變。只是不像c一樣,一定要求在函式開始的地方將所有的變數都申請齊了。

至於樓主提問的,關於建構函式,實際上那申請的一般都是在堆內的空間。和我們剛才所說的,在棧內申請空間還是有本質區別的,希望樓主不要混淆~

申請字串時什麼時候要申請記憶體??

18樓:匿名使用者

如樓主所寫。

char a[size]; 定義陣列,這是系統申請記憶體,只不過是在棧上申請的,因此這個陣列不能太大,否則要溢位。用完後系統自己釋放。

這樣申請的陣列大小必須是個常量, 所以 size 定義時候必要有const,否則編譯不通!

int len = 100;

char *a = new char[len]; 定義指標,這需要自己用new申請記憶體,內存在堆上,陣列可以很大!

用完後 delete a;釋放。

他可以根據你設定變數值,在程式執行中動態申請!

簡單的說:有const,2種都可以;沒有const 只能用new

19樓:匿名使用者

char a[size]; 你宣告了陣列就已經分配了記憶體空間,如果你用指標而不用陣列就要申請儲存資料的記憶體空間!!因為指標只分配了儲存自己的記憶體,並沒分配儲存資料的記憶體!

20樓:匿名使用者

樓主,你要明白一件事。任何資料在宣告時是不佔記憶體的,定義時就需要記憶體。

#include

const int size=100; /此時已分配了乙個4b記憶體了。

void main()

不知道你想說什麼沒有申請記憶體?

可能你是想說:new吧?

(1)在c++中,new 和 delete 是記憶體分配/消除的運算子。程式在執行期動態在程式的堆上臨時分配的,需要程式設計師自己用delete釋放。否則就會發生記憶體或資源的洩露。

(2)在c中還有mallco() 和free()是動態分配/釋放記憶體的庫函式。

在化學方程式中什麼時候用高溫,什麼時候用加熱例如用

一般有固體參加的反應用高溫,如氧化鐵和煅燒碳酸鈣有溶液參加的一般用加熱,如實驗室製取氯氣 加熱與高溫的區別 加熱一般來說,加熱表示的溫度泛指酒精燈火焰的溫度,約在400 500 如nahco3的分解溫度為270 寫成 2nahco3 na2co3 h2o co2 高溫超過500 以上的溫度,在實驗室...

精準扶貧是在什麼時候才可以申請精準扶貧需要哪些條件

屬於貧困人口可以申請精準扶貧。一般情況下,精準扶貧主要就貧困居民而言,誰貧困就扶持誰。精準扶貧針對不同的貧困區域環境 不同貧困農戶狀況,運用科學有效程式對扶貧物件實施精確識別 精確幫扶 精確管理。國家對貧困戶的界定,有其嚴格的劃分標準,最新標準為人均年收入低於2300元。絕對貧困人口 年人均純收入低...

在化學方程式中,化學式前面的數字在什麼時候下有關係

化學方程式的前面數字是依據是質量守恆定律算的。方法如下 首先分析反應物和生成物中各個原子的化合價,然後根據同一原子在化學方程式兩邊化合價的上公升值和下降值相等配平。最後根據兩邊原子數對應相等的法則,配平其他化合價沒有變化過的物質。例如,對於這個化學方程式 no2 h2o hno3 no 的配平方法。...