返回指標的函式

2021-06-29 01:29:59 字數 1757 閱讀 2212

對於最近遇到的一些函式返回指標問題歸類總結,希望對各位讀者也能有所作用。

首先從乙個選擇題開始:

int main()

; char* fun(void)

; 3. static char str = "i love you";

4. static char str = ;

5. char *str = "i love you";

6. static char *str = "i love you";

7. char str = "i love you";char *q = (char *)malloc(10 * sizeof(char)); q = str;

8. char *str = (char *)malloc(10 * sizeof(char));memcpy(str,"i love you",10);

char *q=str;

return q;上面的哪個選項是對的,是不是有些眼花繚亂了,基礎比較好的很快就判斷出來,3,4,5,6,8是正確的,1,2,7是錯誤的用法

下面一一解釋:

1. char str = 「i love you」;

str是乙個char型別陣列首位址,程式執行到此處時,字串「i love you」複製到str指向的儲存空間裡,屬於動態儲存,它是存放在棧(statck)空間內,一旦其所在的函式呼叫結束,那麼str的棧空間被釋放掉,所以上面code中返回的指標q指向的位址空間已經被釋放掉,即變成野指標。

2. char str = ;

這個跟1的道理相同,只不過1中是用字串常量賦值,2中是單個字元賦值,但是str指向的儲存空間都是在statck空間中,儲存方式都一樣即動態儲存。

3. static char str = 「i love you」;

這裡多了乙個static,static在這裡的用途是規定str的作用域是其所在的函式內,str陣列開闢的空間儲存方式是靜態儲存,該陣列變數在程式退出之前會一直存在,所以返回的指標p指向的位址空間會一直存在直到程式退出。

4. static char str = ;

參考3的解釋

5. char *str = 「i love you」;

str本身是放在棧區,字串「i love you」是存放在常量儲存區里,該空間直到程式結束才會釋放,指標str指向該空間,所以返回的指標p指向的位址空間會一直存在。

6. static char *str = 「i love you」;

str本身存放在全域性(靜態)資料區,同時字串「i love you」存放在常量儲存區,兩者都是到程式結束時空間才會釋放

7. char str = 「i love you」;char q = (char )malloc(10 * sizeof(char)); q = str;

這裡的定義有點偷梁換柱的意思,寫這段code的人本來是返回q指向的空間如果不手動釋放會一直存在,但是最後q=str則讓q改變了指向,導致結果與1中的作用相同了。

8. char str = (char )malloc(10 * sizeof(char));memcpy(str,」i love you」,10);

str指向的儲存空間如果不手動釋放會一直存在,所以8正確

經過上面的解釋可以總結一下,對於返回指標型別的函式盡量按照下面幾種方式來使用

1 使用malloc分配空間

2 使用static變數指標

3 使指標指向常量空間

4 指向全域性變數的指標

當然還有二級指標的傳遞等,有興趣的讀者可以繼續研究………

返回指標的函式

5.cpp created on 2011 8 13 author san include float search float pointer 4 int n int main void float p int i int m printf enter the number of student ...

返回指標的函式

返回指標的函式 每個函式可返回乙個值,返回值可以是char int float double等型別,當將返回值型別設定為void時,表示函式沒有返回值。在c語言中,還允許乙個函式的返回值是乙個指標 即位址 這種返回指標的函式稱為指標型函式。定義指標型函式的形式如下 cpp view plain co...

指向函式的指標 返回指標的函式

1.函式指標表示指向某一函式的指標,如下所示,int add int,int int pf int,int pf add 注意,因為函式add有兩個引數,所以pf指標也必須有兩個引數 且函式add的兩個引數均為int型,所以pf的兩個引數也必須與之匹配。如下例,include stdio.h inc...