當前位置:首頁 » 編程軟體 » 靜態變數在編譯時分配內存

靜態變數在編譯時分配內存

發布時間: 2022-05-31 20:11:41

1. C語言問題:內存的分配方式有哪幾種

1、靜態存儲區分配

內存分配在程序編譯之前完成,且在程序的整個運行期間都存在,例如全局變數、靜態變數等。

2、棧上分配

在函數執行時,函數內的局部變數的存儲單元在棧上創建,函數執行結束時這些存儲單元自動釋放。

3、堆上分配

堆分配(又稱動態內存分配)。程序在運行時用malloc或者new申請內存,程序員自己用free或者delete釋放,動態內存的生存期由我們自己決定。

(1)靜態變數在編譯時分配內存擴展閱讀

棧上分配數組

#include<iostream>

usingnamespacestd;

voidmain()

{

int**arr=NULL;//int型二維數組

introws,columns;

cin>>rows;//2

cin>>columns;//3

//請在此處編寫代碼,根據rows和columns在棧上分配一個數組arr

...你的代碼...

//賦值給數組元素

for(introwIndex=0;rowIndex<rows;rowIndex++)

{

for(intcolumnIndex=0;columnIndex<columns;columnIndex++)

{

arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;

}

}

//列印每個數組元素

for(rowIndex=0;rowIndex<rows;rowIndex++)

{

for(intcolumnIndex=0;columnIndex<columns;columnIndex++)

{

printf("%d",arr[rowIndex][columnIndex]);

}

printf(" ");

}

}

2. (C語言)編譯時給全局變數和靜態變數分配存儲空間,運行時給局部變數分配存儲空間,這樣說對嗎

全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間

全局變數本身就是靜態存儲方式, 靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一源程序的其它源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。

3. c++編譯系統在編譯時對靜態存儲變數分配存儲單元嗎

是啊,就是在編譯的時候分配的么,不過你也可以動態分配,比如malloc函數,這樣的內存是在堆中申請的,所以程序執行的時候才會申請,一般的變數什麼的,包括數組都是在棧中存放,堆就是要靠用戶管理的數據區域,棧則是有系統自動管理的。

4. C++靜態數據成員是在編譯時分配空間,那普通數據成員是在什麼時候分配內存空間,是在運行時嗎

靜態變數是在編譯時分配的,程序結束時才釋放
動態變數是在運行時動態分配的,根據你定義的位置確定,比如你在一個函數中定義的,那麼超出該函數范圍變數將被釋放

5. 我們經常看到書上面說的 某某變數的內存單元是編譯器在編譯時候分配的 是什麼意思

所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以

明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不
必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用
域,生存期等等),對應的只是一塊內存(只有首址和大小),
所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了;
寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實
現申請和釋 放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行。

6. 靜態變數是在編譯時分配內存空間,編譯時是什麼時候編譯時都做什麼東西啊

靜態變數在編譯時進行初始化,運行階段分配內存空間。靜態變數在整個程序生命周期都是存在的。

7. 靜態變數在內存哪分配的

內存不止分為堆和棧,還有另外3個區:
|-----------|
|     棧     |
|-----------|
|      |      |
|     \|/     |
|             |
|     /|\     |
|      |      |
|-----------|
|     堆     |
|-----------|
| 未初始化|
|------------|
|    初始化 |
|------------|
|   正文段 |
|------------|
其中棧是由編譯器自動分配釋放,堆區是程序員申請釋放;
全局變數和靜態變數是存儲的一起的,全局未初始化變數和靜態未初始化變數放在未初始化區(又稱BSS區),全局初始化變數和靜態初始化變數放在初始化區;
代碼的二進制存放在正文段。。

8. 編譯器編譯高級語言為低級語言的時候,給全局變數或靜態變數是如何分配內存的

對於C和C++的編譯器,全局變數和靜態變數都是在專門的數據區保存的,更具體一點,一般是在.data和.bss段保存的,具體在哪個段,編譯器會根據代碼中是否對這些變數進行了初始化來決定,如果初始化過,並且初始化的值不為0,那麼這個這個變數一般就會被放在編譯結果的.data段中,否則就是放在.bss段中。
.data段中就保存變數的符號,還保存變數的初始化值,而在.bss段中,只保存變數的符號,而不保存值,這是因為這部分的變數都將被初始化為0,這也是為什麼static聲明的變數即使沒有初始化也會是0的原因。
這些段都會在程序被執行的時候由操作系統(或鏈接器)載入到指定的內存中,便完成相應的初始化。

9. C++中局部靜態變數是在什麼時刻產生(分配內存)在編譯時,還是等運行到該變數的首次出現時

局部static 變數在程序運行的時候分配空間了,只不過作用域是局部的,生存期和全局變數一樣到程序結束

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:649
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:940
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:635
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:824
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:734
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1070
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:302
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:164
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:855
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:766