動態記憶體可以跨函式使用示例與靜態變數不能跨函式使用

2022-07-30 01:27:07 字數 1483 閱讀 5485

動態記憶體可以跨函式使用示例

# include # include 

void f(int **q)

int main(void

)

有問題的(靜態變數不能跨函式使用,以為乙個函式執行完畢,他的空間將會被釋放):

1 # include 2

3void 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 ...