C 中宣告變數時,系統會在棧上分配記憶體,在程式結束時會釋放

2022-03-24 03:08:52 字數 3566 閱讀 8020

1樓:愛上榛子的核桃

區域性變數放在棧(stack)上,靜態、全域性、動態分配多放在堆(heap)中。動態分配的空間遠遠大於棧上的空間。比如你要裝載一幅圖到記憶體中進行處理,棧是肯定放不下的,只能用動態分配。

因此,不要使用太大的區域性陣列,而儘量使用動態分配,最後不要忘了釋放掉。

2樓:匿名使用者

當你的程式需要指定的大小時就需要動態分配,應該動態分配更安全。

3樓:匿名使用者

一個需要你給它指明容量(就是分配的空間),一個不需要。

4樓:匿名使用者

1 棧速度快 堆速度慢

2 棧空間小 堆空間大

5樓:

動態分配使程式靈活,適應性好,省記憶體。

例如,處理一個時間系列y(t)統計問題的程式, y(t) 樣品個數可能3600個,也可能7200個,也許更多,也許更少。非動態分配,我們要宣告一個大陣列備用,例如 float y[86400];

動態分配是程式執行時,由使用者輸入陣列大小,或程式判斷資料長度,再臨時用 malloc 分配儲存單元,用多少單元分配多少單元,用完可以用 free 釋放。

棧,是先進後出。動態分配不是棧上,不是先進後出。

c語言是在宣告變數的同時,分配記憶體的嗎?程式結束執行了,記憶體會釋放嗎?

6樓:匿名使用者

宣告變數比如int a;這樣編譯器是不會分配記憶體控制元件的,int b=10;是會分配記憶體控制元件,程式結束後會自動釋放

7樓:匿名使用者

宣告變數比如char a;這樣編譯器是不會分配記憶體控制元件的;int d=1是會分配記憶體控制元件,程式結束後會自動釋放

8樓:愛吃炒餅

變數定義的同時,必然分配記憶體,但有一些的動態分配的。

9樓:騰空飛飛樂樂

宣告時不分配記憶體,程式結束時,記憶體會釋放。

10樓:匿名使用者

是在定義初始化時候分配的 不一定自動釋放 根據位置不同

11樓:洛雨

恩,這個是自動分配的。它這個不是說佔多少記憶體,程式是在flash或者叫rom(只讀儲存器),相當於電腦硬碟,你不執行程式,當然就不佔記憶體

12樓:東島伯爵

只是宣告的時候不分配記憶體空間。是定義或者宣告並定義的時候分配儲存空間。會釋放記憶體。

13樓:冰清翔龍

只要是在棧上分配的,都是在宣告的時候分配了記憶體。如果是在堆上面分配記憶體的,就是在編譯的時候分配

int* p = (int*)malloc(4 * sizeof(int));

p 這個指標是分配了記憶體的,而它指向的地址就是執行到這裡才分配的一般有這幾種型別

型別 位元組

char 1

short 2

int 4

自己定義的結構體就另外計算

14樓:曉晨之巔

一般是的,但是有有一種記憶體分配叫動態分配記憶體,c裡一般涉及函式有malloc,relloc,calloc,c++一般是new,這些記憶體分配後,一般要求程式設計者在用完後將其釋放。

各型別變數所佔記憶體位元組數視系統位數而定。例如16的機子而言:char 1位元組,int 2位元組,float 2位元組,double 8位元組。

c++函式執行結束後,會自動釋放棧上的空間,即存放hello world的單元可能被重新寫入資料

15樓:匿名使用者

這是個好問題,記憶體並不是清空了,而是用了可能會出錯。

在你的程式裡,p指標指向的記憶體剛好沒有被其他**破壞,所以你可以列印出來。

你可以試試在輸出語句前再定義一個字串看看結果。

16樓:

釋放不是說清空。這是你理解錯誤。

宣告一個變數或者常量的時候如果你沒有賦值,並不是說哪塊記憶體區域就是空的(或者全零)。此時只是宣告這塊區域用來存放。並把這塊區域標識為已分配。

當你釋放的時候他也不會去刪除那塊區域的記憶體的資料。只是把這塊區域標識為未使用,可供使用。

沒有「清空」這個概念,只是釋放。記憶體釋放後資料任然存在。你用一個相符型別的指標指向被釋放的地址,當該地址的資料還未被其他程式改寫,當然是可以讀取釋放前的資料。

你可以把這個做成迴圈輸出 p的值。然後啟動一個大型程式。很快你就會看到p的輸出會發生變化。

在c++中定義一個變數,例如:int a; 此時已經為a分配空間了嗎

17樓:匿名使用者

定義分為定義性宣告和應用性宣告,第一種為定義,其實這只是狹義的定義和宣告,你所說的狀況要分情況,例如如果a是一個全域性變數,那麼int a就是宣告,擴充套件作用域,如果int a;a= 0;那就是定義。這兩種情況都已經分配記憶體空間。

18樓:匿名使用者

看你定義的變數的型別

1) 堆

int* a = new int[100];//執行到這裡才給a指向的空間分配

2) 棧

void fun()

3) 全域性變數,常量

程式啟動時分配

4) static

void fun()

所以說如果你定義的是全域性變數,程式啟動時分配記憶體,如果是區域性變數,則執行到那裡時才分配!

19樓:

int a;是在棧中分配了記憶體。

int *a=new int;//在堆中分配了記憶體

20樓:

是的,已經分配空間了。

程式退出,c++中的堆佔的記憶體就會釋放,那還要我們用delete函式釋放幹嗎,棧中的記憶體

21樓:匿名使用者

堆是堆,棧是棧,兩者不能混為一談

棧中記憶體由系統分配,程式結束會自動釋放

堆中記憶體是自己申請的,用完不會自動釋放,如不及時釋放會導致記憶體洩露

22樓:廖北伯

如果某個程式使用的記憶體不多, 確實是不必delete. 程式結束後作業系統會把整塊記憶體完整收回.

delete的用意是在程式本身配置的空間中有借有還.

如果你的程式不斷使用node, 經常用new. 這些node若稍後不用就該**.

若都沒delete. 就有可能耗盡配給這程式的記憶體.

23樓:匿名使用者

練習用的小程式當然無所謂..

不要忘了計算機不是隻有你一個程式在執行的, 你的程式要是不停的吞掉記憶體, 其他的程式就只能分配虛擬記憶體了, 整個系統會被拖垮.

24樓:兔子和小強

執行時刻避免造成記憶體洩露,

不及時釋放,無節制的使用很耗記憶體

25樓:匿名使用者

舉例來說,如果一個按鈕裡申請的記憶體不釋放,而使用者連續點選這個按鈕10000次,佔用的記憶體就會越來越多,到退出才全部釋放太晚了。

C中,在宣告變數時不賦值和宣告變數時賦值,有什麼區

引用型別宣告變數時賦值可以避免null錯誤,非引用型別會自己增加初始值不管你是否賦值。當然有區別,比如bai 賦值的話變數裡面du就zhi會有值,而不賦值,只是開闢dao了這麼一個空間內 裡面放的東容西是什麼就不知道了,會造成你程式出錯。比如 int a,b,c c a b 這個時候你根本不知道a和...

C語言可以再for語句中宣告變數嗎

可以的,在for語句的迴圈體的大括號之內的最前面可以宣告變數,作用域僅在大括號內,出迴圈就被捨棄,是屬於迴圈體的臨時變數。for i 0 i 10 i c語言 可以在for裡面同時定義變數嗎?可以的,比如 include void main 但是注意 在for裡面定義的區域性變數只有在for語句塊裡...

c中變數的地址是什麼型別的

變數地址是什麼型別,這是個怪異的問題,表示你沒有理解其基礎.電腦的作業,都是單純的資料回與邏輯答,我們說的十進位制,十六進位制,都只是對同一個數字的不同表達方式,在電腦中都是一樣的.0x30 h 48 d 60 8 110000 2 變數型態,指的是,電腦對某位置的處理方式,會依照宣告的型態採取不同...