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 變數型態,指的是,電腦對某位置的處理方式,會依照宣告的型態採取不同...