對於最近遇到的一些函式返回指標問題歸類總結,希望對各位讀者也能有所作用。
首先從乙個選擇題開始:
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...