C語言函式返回值的相關問題

2021-06-05 03:17:33 字數 2180 閱讀 4092

程式一:

int main()

return 0;

};int* fun(void)

;int*q=str;

return q;

}//不能正確返回

雖然str是在動態變數區,而該動態變數是區域性的,函式結束時不保留的。

程式二:

int main()

;char * fun(void)

//可以正確返回

但是,字串"hello"不是變數,而是乙個常量,編譯程式在處理這種常量時,通常把它放在了常量區中。而常量區則是始終存在的。

後乙個例子中函式fun的返回值就是乙個指向這種常量區的指標。

函式返回指標,要使主程式可以使用這個指標來訪問有意義的資料,關鍵就是要保證在使用這個指標值的時候,該指標所指向的地方的資料仍然有意義。

還有,如果指標是指向函式的指標,那麼這個指標就是指向程式**區的。這也是一種應用的情況。

另外,如果明白了它的原理,程式設計師還可以發明出一些其他靈活的使用方法,當然,那都屬於「怪」方法,一般不提倡的。

程式三:

int main()

;int fun(int a,int b)

//可以正確返回

程式三:

這個例子中,返回的不是變數max的位址,返回的是它的值。

return後面的東西,看做乙個表示式,返回的是這個表示式的值。

例如,入口如果a是3,b是5,則此時(執行return語句時)max裡面存的是5。而return語句的功能就是把max裡面的5取出來,放到「返回值暫存器」中。

主程式是從「返回值暫存器」得到這個5的(此時max變數已經不存在了)。

你前面的第二個例子中,同樣,指標變數str在函式結束後已經不存在了。但是在return語句中,把指標變數str裡面的值(等於字串"hello"存放處的位址)送到「返回值暫存器」中了。

動態變數str不存在了,但常量區中的字串"hello"還存在。主程式根據返回的位址就可以找到該字串。

程式四:

int main()

char* fun(void)

;char str="hello";

printf("%x\n",str);

return str;

}//不能正確返回

char str="hello"; 是在動態變數區中開闢了可以容納6個字元的陣列,陣列名叫str。同時將字串"hello"(原存放於常數空間)拷貝到這個陣列空間中去作為陣列的初始化值。

此時若執行return str; 其中的str是陣列名。c語言規定,表示式中如果是陣列名,則該表示式的值就等於這個陣列的位址。所以返回的是這個陣列的位址,請注意:並不是字串常量"hello"的位址!而函式結束時,雖然常數空間並不破壞,但這個陣列空間是破壞了的,而你返回的卻不是常數空間裡的位址而正是已經破壞了的陣列的位址。

而char *str="hello"; 是在動態變數區中開闢了乙個可以存放乙個指標值的變數,名叫str。同時將原存放於常數空間的字串"hello"的位址賦給這個指標變數作為初始值。

此時若執行return str; 其中的str是指標變數名。c語言規定,表示式中如果是變數名,則該表示式的值就等於這個變數的值(指標變數的值就是位址)。所以返回的是變數str的值,而變數str的值就等於字串常量"hello"的位址。而函式結束時,變數str破壞了的,但常數空間中的字串並不破壞。主程式根據返回的位址就可以找到該字串。

【總結】

常規程式中,函式返回的指標通常應該是:

(1)指向靜態(static)變數;

(2)指向專門申請分配的(如用malloc)空間;

(3)指向常量區(如指向字串"hello");

(4)指向全域性變數;

(5)指向程式**區(如指向函式的指標)。

除這5項以外,其它怪技巧不提倡。

函式內的變數,沒有關鍵字static修飾的變數的生命週期只在本函式內,函式結束後變數自動銷毀。當返回為指標的時候需要特別注意,因為函式結束後指標所指向的位址依然存在,但是該位址可以被其他程式修改,裡面的內容就不確定了,有可能後面的操作會繼續用到這塊位址,有可能不會用到,所以會出現時對時錯的情況,如果需要返回乙個指標而又不出錯的話只能呼叫記憶體申請函式

返回結構體:

#include

typedef struct str;

str change(str s)

int main(void)

//可以返回

C語言函式返回值的相關問題

程式一 int main return 0 int fun void int q str return q 正確返回 static修飾符,陣列被儲存在了靜態儲存區。程式二 int main char fun void 可以正確返回 但是,字串 hello 不是變數,而是乙個常量,編譯程式在處理這種常...

關於C語言函式返回值問題

程式一 int main return 0 int fun void int q str return q 不能正確返回 雖然str是在動態變數區,而該動態變數是區域性的,函式結束時不保留的。程式二 int main char fun void 可以正確返回 但是,字串 hello 不是變數,而是乙...

C語言的函式返回值

一 背景 談到c語言的函式返回值,可能會感覺很親切,不就是乙個函式返回值嘛,當初學c語言的時候早就學過了很easy嘛,我曾經也是這麼想的。後來要上研究生了,研究生階段搞得就是c,所以又重新開始學習c,學習c的過程中遇到了很多問題,在此部落格中一一記錄。實際過程中遇到的第乙個問題自然就是函式返回值了。...