1、我想問主函數的執行過程以及調用到子函數時內存除了存儲了子函數的返回地址,還存了什麼=====》還「保存」了參數,確切的說,是把子函數需要用到的參數
壓入到內存棧裡面,供子函數調用的時候取
2、子函數的內存里按照內存地址順序分別存了什麼?
===》籠統的講,裡面的變數等
更詳細的信息,你可以網路
「函數調用過程詳解」
來作深入研究
㈡ C語言:函數的形式參數存放在內存的
形參只是一個符號,不會分配具體的空間的..
當函數被調用的時候,具體給出的參數,也就是實參,其實是一份拷貝..
它的內存空間在該函數的堆中進行分配.
比如
定義函數
int
add(int
,int);
在主函數中
定義變數
int
x,
y..
調用函數
add(x,
y);
那麼在函數add的堆中會分配出空間,來保存實參x
y的拷貝..
而主函數中的
x
y
是在主函數的堆中保存的...
不曉得有沒有說明白..呵呵
㈢ c語言中 函數調用結束後,函數內定義的靜態變數所佔用的空間被釋放 這句話正確嗎求解釋
錯誤!
第一,對於動態存儲方式,在函數調用開始時分配動態存儲空間,函數結束時釋放這些空間,例如傳值的函數調用,int x=3,y=4; fun(x,y)//函數里x=4,y=3 ;函數調用結束後釋放,main函數仍然是x=3,y=4
第二,在靜態存儲區內分配的存儲單元,在程序整個運行期間都不釋放,若非必要,盡量不要靜態變數
int main()
{ int f(int);
int a=2,i;
for(i=0;i<3;i++)
printf("%d\n",f(a));
return 0;
}
int f(int a)
{ auto int b=0;//自動局部變數
static c =3;//靜態局部變數
b=b+1;
c=c+1;
return(a+b+c);
}
輸出為 7(2+1+4) 8(2+1+5) 9(2+1+6)
㈣ C語言調用函數時會為函數分配自己的函數空間嗎
C語言每一次函數調用,編譯器都會為這個函數調用分配一段空間,這段空間用來存放該函數中的所有局部變數和調用其它函數時需要傳遞的參數的副本。每一次調用這個函數,這段空間都會重新分配,函數返回後這段空間就被釋放了,所以重復調用多少次都不會影響的。所有的這些函數調用時候分配的內存都是在線程的棧上的。
順便說一下,我覺得樓上的回答是不對的: 每個線程都只會訪問自己調用的函數中的局部變數的,訪問局部變數是不會存在多線程問題的。會存在多線程問題的肯定不是局部變數,有可能是局部變數指向的其它可共享的對象(例如:堆對象......),或者在函數中訪問了全局對象,類的成員變數等,這些並不是局部變數。
㈤ 關於C語言中函數調用時內存管理方面的問題。
一般情況下C里能造成你這種效果的唯一可能就是 malloc之類申請的內存沒用free之類釋放。非一般情況指你用更底層的方法(比如Windows得HeapAlloc之類)申請內存來著
----
生化的基本原理我倒是還懂的,並且我堅信就算小學沒上過自然課的程序員也能看出來你的問題出在哪兒|||
㈥ 關於C語言函數內部內存分配的幾個問題~~
1、可以用if代替assert斷言。
2、如果空間夠,分配就會失敗,malloc()會返回一個NULL指針。而free()函數對空指針沒有作用(相當於不調用free()函數)
3、如果分配失敗,就不用作清理工作(比如調用free()函數)。
㈦ C語言 被調用函數里棧區分配的內存,主調用函數是不能使用的
我是這么理解的,函數調用返回值也會根據類型分配一段內存空間,fun1的返回值類型是int型,程序會分配4個位元組用於保存int型的返回值,而a是個整形,它的值在內存釋放前賦值拷貝給了返回區空間。
fun2和fun3的返回值類型是char *,程序會分配4個位元組的內存空間保存返回值,這個值存儲的是一個地址,而 p = 「abcde」指向的是常量區,在函數調用結束前將p指向的地址(假如是0X00000111)拷貝給了返回值區間,函數調用結束後雖然釋放了局部變數p所佔的空間,但函數返回值空間保存的是拷貝過來的地址(依然是0X00000111),而這個地址所指向的內存區並沒有釋放,所有p可以看到指向的是"abcde"
而fun3拷貝的是局部變數str所存儲的地址(假如是0x00002222),函數調用結束時會釋放局部變數str的分配的內存,這個時候0x00002222所指向的內容就不確定了,因為它被回收了...所有如果調用fun3,它的返回值是不確定的
㈧ C語言 調用函數完後釋放內存嗎
肯定會釋放了,函數調用完成後,函數里的所有局部變數將會被釋放。但是你寫的這個程序根本就有問題。你所返回的只是一個地址空間,所以一直沒變,釋放指的是將這個地址里的內容清除掉,以便使其它的數據可以用這個地址的內存。如果沒釋放的話,其它的數據就用不了這個址址了。
c的內存泄露主要是出在指針上面。對於變數,系統都會在用完後自動釋放的。
㈨ c語言中,函數發生調用時,實參和形參都會佔用內存嗎
是的,
形參
和
實參
是兩個不同的
存儲單元
,都佔用內存空間,當
函數調用
結束後,形參的內存空間也就會被釋放掉了。
㈩ C語言中函數是如何存儲的
1. 代碼本身是存儲在內存的代碼段中的,而函數沒有說存儲的概念,函數調用時是通過棧來實現的。
2.在函數體內聲明的變數在默認情況下都是auto存儲類型
在代碼塊之間傳遞信息的一種方法就是使用外部變數。當一個變數在函數的外部被聲明時,安的存儲空間是永久分配的,安人存儲類型是extren.外部變數的聲明看上去和函數或代碼塊內部所聲明的變數一樣。外部變數對於它之後的所有函數都有效。在代碼塊或函數後,外部變數仍然存在。
3.static的基本用途是允許一個局部變數在重新進入代碼塊時能夠保持原來的值。這和自動變數形成了鮮明的對比,自動變數在代碼塊時會被銷毀,再次進入這個代碼塊時,它必須重新進行初始化。
4.egister存儲類型告訴編譯器相關的變數應該改量存儲在高速度的寄存器中。使用register存儲類型的目的一般是為了提高執行速度,但是,register聲明只是向編譯器所提出的「建議」,並非強制要求。