C語言再學習8——return

前言:

爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。

在這裏插入圖片描述


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”; 的區別,他們的存放空間是不一樣的。


參考:

1.C語言的那些祕密之—函數返回局部變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章