動態記憶體可以跨函式使用示例
# include # includevoid f(int **q)
int main(void
)
有問題的(靜態變數不能跨函式使用,以為乙個函式執行完畢,他的空間將會被釋放):
1 # include 23void f(int ** q) //
q是個指標變數,無論q是什麼型別的指標變數,都只佔4個位元組410
11int main(void)12
3、下程式中,能夠通過呼叫函式fun,使main函式中的指標變數p指向乙個合法的整型單元的是
a) main()
{ int *p;
fun(p);
int fun(int *p)
{ int s;
p=&s;
b) main()
{ int *p;
fun(&p);
int fun(int **q)
{ int s;
*q=&s;
c) #include
main()
{ int *p;
fun(&p);
int fun(int **q)
{ *q=(int *)malloc(4);
d)#include
main()
{ int *p;
fun(p);
int fun(int *p)
{ p=(int *)malloc(sizeof(int));
2023年4月45題
注釋: 這個題很有意思。考查了:
1) 指標的指標的使用 2) 動態記憶體分配與自動變數的記憶體分配。
動態分配的記憶體必須呼叫free()函式才能釋放,而自動變數一旦跳出它的**作用範圍,就會由編譯器自動釋放掉。
讓我們先看:
a) 選項無論fun()中p的值如何變化,都不會影響到主函式中p的值,因為它是值傳遞
b) 選項倒是把p的位址&p傳遞給了fun()函式,但遺憾的是,由於s是個自動變數,當推出fun()函式後,s變數所佔記憶體單元會被會被釋放掉,此時主函式中的p還是沒法指向乙個合法的int型單元
c) 選項fun()的形參 int **p;表明p是個指向指標變數的指標變數,即是個指標的指標。 而主函式中的 int *p; 表明p只是個指標變數,但&p則指向了p,&p也是個指向指標變數p的指標變數,實參和形參型別一致。 fun()的功能是使實參p指向了乙個int型變數, 又由於該int型變數是由malloc()動態分配的,所以推出fun()函式並不會影響實參p的指向, 故c是對
d) 選項犯了和a同樣的錯誤。 真想不到二c還會考到這個知識,哈哈!
動態記憶體與靜態記憶體的區別
1.靜態記憶體 靜態記憶體是指在程式開始執行時由編譯器分配的記憶體,它的分配是在程式開始編譯時完成的,不占用cpu資源。程式中的各種變數,在編譯時系統已經為其分配了所需的記憶體空間,當該變數在作用域內使用完畢時,系統會 自動釋放所占用的記憶體空間。變數的分配與釋放,都無須程式設計師自行考慮。eg 基...
C語言靜態記憶體分配與動態記憶體分配
c語言中,記憶體主要分為5個區,分別為棧區 堆區 全域性 靜態儲存區 常量儲存區 區。其中 區存放源程式的二進位制 其餘四個區都儲存程序執行過程中需要的儲存的變數。變數的記憶體分配有兩種 靜態與動態。靜態記憶體分配在編譯時就對變數分配空間,而動態記憶體分配直到程式執行時再進行分配。使用靜態記憶體分配...
2 4 析構函式與建構函式中使用動態記憶體
在析構函式與建構函式中使用動態記憶體 1.析構函式的使用 1 析構函式在物件對銷毀時自動呼叫,一般有2種情況 2 用new分配的物件,用delete顯式析構 3 分配在棧上的物件,當棧釋放時自動析構 4 普通情況下析構函式都是空的,因為不必做什麼特別的事情 2.在class中使用動態記憶體變數 1 ...