前言:
爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。
1. return
return: 用來終止一個函數並返回後面跟的值。
使用:return (表達式);//() 可省略
注:
(1)C 不支持在函數外返回局部變量的地址,除非定義局部變量爲 static 變量。
char *Func(void)
{
char buf[10];
......
return buf;//錯誤
}
buf 屬於局部變量,位於棧內存中,在 Func 結束的時候被釋放,故導致返回 buf 錯誤。
(2)函數可以返回局部變量的值,不涉及地址。
舉例:
(1)
#include<stdio.h>
#include<stdlib.h>
char *Return_Test(void)
{
char *str = "return test";
return str;
}
int main(void)
{
char *pstr;
pstr = Return_Test();
printf("Return test is %s \r\n",pstr);
system("pause");
return 0;
}
因爲字符串 char *str = “return test” 聲明的是一個字符串常量,存儲在只讀數據段,聲明的字符串指針僅是存放了只讀數據段字符串的首地址,當程序結束退出時,存放該字符串的內存不會被收回。
(2)
#include<stdio.h>
#include<stdlib.h>
char *Return_Test(void)
{
char str[] = "return test";
return str;
}
int main(void)
{
char *pstr;
pstr = Return_Test();
printf("Return test is %s \r\n",pstr);
system("pause");
return 0;
}
因爲 char str[] = “return test” 是一個局部變量,存儲在棧中,當函數結束退出時,棧被清空,此時函數返回的是一個被釋放的地址,測試結果爲亂碼,如下圖:
上面的實現,如果加上 static 修飾(static char str[] = “return test”;),即可以的得到正確運行結果,實質是改變了變量的存儲地址。數組的類似,因爲數組名在編譯器眼裏,是局部變量的地址,返回一個地址等價於返回這個數組的指針,同樣是涉及在棧去申請內存的問題。如果返回的是堆內存(用函數 malloc 申請的內存)的指針,則是可以的。malloc 申請的內存,用完了要及時釋放(free),否則造成內存泄漏。
(3)
#include<stdio.h>
#include<stdlib.h>
char Return_Test(void)
{
char str = 'a';
return str;
}
int main(void)
{
char pstr;
pstr = Return_Test();
printf("Return test is %c \r\n",pstr);
system("pause");
return 0;
}
返回一個局部變量(靜態/動態)的值是可以的,不涉及地址。
函數返回局部變量的值的可以的,但是涉及返回指針變量的時候,要注意函數執行結束後這一段內存是否還存在。注意定義:char *str = “Return test”; 與 char[] = “Return test”; 的區別,他們的存放空間是不一樣的。