樓主針對你這句給你解釋下:
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的蕪湖網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
“str 屬于局部變量,位于棧內(nèi)存中,在Func 結(jié)束的時候被釋放,所以返回str 將導(dǎo)致錯誤。
為什么當(dāng)返回的是int *p類型時卻正確?按理說應(yīng)該都被釋放了。”
無論是 str還是整型指針p所指向的空間,確實(shí)都已經(jīng)被釋放了,只是這個釋放你要理解清楚,一般的編譯器,釋放!=清零(至少我沒見過釋放同時會清零相應(yīng)內(nèi)存的編譯器),釋放只是告訴系統(tǒng),這一塊內(nèi)存我不用了,他就像海域的公海一樣,只要你還有這塊內(nèi)存的地址,一樣可以訪問,只是這段內(nèi)存隨時可能分配給其他進(jìn)程使用,隨時可能被修改,在被其他進(jìn)程占用修改之前,你都是可以訪問這段內(nèi)存的(因?yàn)獒尫艃?nèi)存時,指針變量str和p的值不會變,始終指向給他賦值時指向的那一塊內(nèi)存空間,盡管指向的內(nèi)存已經(jīng)不歸本進(jìn)程使用,其實(shí)現(xiàn)在str和p已經(jīng)就是所謂的野指針)。
整型指針?biāo)赶虻膬?nèi)存塊只有四個字節(jié),一般釋放后馬上被分配給其他進(jìn)程,并被修改的可能性不大,如果是一個字符串,一旦代表字符串結(jié)束符的‘\0’被修改,很容易就會報一個訪問越界,或段錯誤…………
一般編程的時候,不要返回一個局部變量指針,這種錯誤是非常危險的,因?yàn)樗裁磿r候出錯是有一定的隨機(jī)性,以后排錯的時候都很難,就像野指針一樣。
p是指向局部變量的指針,當(dāng)函數(shù)退出時,局部變量會被釋放,這時,p所指向的位置就不一樣是原來的數(shù)。
因?yàn)閒un()函數(shù)返回的值被計(jì)算機(jī)的臨時變量存放,當(dāng)賦值給p的時候,p是指向臨時變量的地址,所以還可以讀取出100。
*p = "hello"這是常量字符串,從靜態(tài)存儲區(qū)分配,第一步字符串"hello"從靜態(tài)存儲區(qū)獲取一塊內(nèi)存,指針變量p才指向這塊靜態(tài)內(nèi)存,這塊內(nèi)存的特點(diǎn)是從程序開始到結(jié)束一直從在,所以可以返回。
擴(kuò)展資料:
函數(shù)的返回值類型是在定義函數(shù)時指定的。return 語句中表達(dá)式的類型應(yīng)與定義函數(shù)時指定的返回值類型一致。如果不一致,則以函數(shù)定義時的返回值類型為準(zhǔn),對 return 語句中表達(dá)式的類型自動進(jìn)行轉(zhuǎn)換,然后再將它返回給主調(diào)函數(shù)使用。
在調(diào)用函數(shù)時,如果需要從被調(diào)函數(shù)返回一個值供主調(diào)函數(shù)使用,那么返回值類型必須定義成非 void 型。此時被調(diào)函數(shù)中必須包含 return 語句,而且 return 后面必須要有返回值,否則就是語法錯誤。
參考資料來源:百度百科-返回值
C語言中的return命令結(jié)束函數(shù),返回調(diào)用者
如果函數(shù)定義是有返回值的,則return 后面會跟一個相應(yīng)類型的常量或變量,目的是返回給調(diào)用者一個數(shù)據(jù)(數(shù)值)。
函數(shù)定義格式:
返回值類型 函數(shù)名( 形參及類型 )
{
函數(shù)語句;
return 相應(yīng)返回值類型的常量或變量 ;
}
返回值是需要調(diào)用者用變量來接收的,不是顯示到屏幕上的。如果需要輸出返回值,則需要調(diào)用相應(yīng)的輸出語句,進(jìn)行數(shù)據(jù)輸出。
例:
int max( int a, int b )
{
if ( ab ) return a;
else return b;
}
char *input(char *s )
{
gets(s);
return s ;
}
void main()
{
int a=3,b=5;
int m;
m=max(a,b); //用m接收返回值
printf("max=%d\n", m ); //輸出
char str[100];
char *p;
p=input(str); //指針變量p接收返回值
printf("input=%s", p ); //輸出地址中的字符串?dāng)?shù)據(jù)
}
在C語言中,局部變量的作用域只在函數(shù)內(nèi)部,在函數(shù)返回后,局部變量的內(nèi)存就會被釋放。如果函數(shù)只是返回局部變量,那么這個局部變量會被復(fù)制一份傳回被調(diào)用處。但是如果函數(shù)返回的是局部變量的地址,那么就會報錯,因?yàn)楹瘮?shù)只是把指針復(fù)制后返回了,但是指針指向的內(nèi)容已經(jīng)被釋放,這樣指針指向的內(nèi)容就是不可預(yù)料的內(nèi)容,程序就會出錯。準(zhǔn)確的來說,函數(shù)不能通過返回指向棧內(nèi)存的指針(返回指向堆內(nèi)存的指針是可以的)。
我給你從編譯器角度考慮下吧!1、首先局部變量的使用范圍只有在這個局部范圍類有效。2、函數(shù)是模塊化的思想。比如你有一個判斷一個數(shù)是否是素?cái)?shù)的函數(shù)。那么你再求100以內(nèi)所有素?cái)?shù)和的時候,main中會調(diào)用這個函數(shù)100次。這些函數(shù)編譯器在處理的時候都是放在一個堆棧的。而且每個函數(shù)都占有不同的地址和空間。(遞歸函數(shù)尤為明顯)。最關(guān)鍵的是,當(dāng)函數(shù)返回函數(shù)值后,函數(shù)的使命就結(jié)束了。所以這個函數(shù)體在呢內(nèi)存中就銷毀了。你即使能從函數(shù)中返回一個局部變量。你再去讀這個地址的時候。東西都不在了。3、還有一點(diǎn)。編譯器在分配函數(shù)的空間的時候,地址不是固定的。所以你每次運(yùn)行程序,你會發(fā)現(xiàn)
int
a=3
printf(f"%d",a),不都是一樣的。所以你的問題很明了了。
分享題目:c語言函數(shù)不能返回??臻g c語言函數(shù)不能返回??臻g嗎
分享URL:http://m.kartarina.com/article30/hgjspo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站制作、Google、標(biāo)簽優(yōu)化、商城網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)