C语言函数不能返回局部变量的地址
生活随笔
收集整理的這篇文章主要介紹了
C语言函数不能返回局部变量的地址
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在C中,正常情況下,我們只能從函數(shù)中返回一個(gè)值。但在很多情況下,我們需要從函數(shù)中返回多個(gè)值,此時(shí)使用數(shù)組或指針能夠很好地完成這樣的任務(wù)。這里是一個(gè)示例。這個(gè)程序使用一個(gè)整型數(shù)組作為參數(shù),并將數(shù)組元素的和與積返回給調(diào)用函數(shù)。下面是C代碼,這是一種常見(jiàn)情況。下面給出實(shí)現(xiàn)技巧:
#include?<stdio.h>? #include?<conio.h>? int*?Pool(int?array[],int?size) ? { ? ???int?*x; ? ???int?i=0; ? ???int?a[2]={0,1}; ? ???for(i=0;i<size;i++) ? ???{ ? ??????a[0]+=array[i];???????????????????????//存儲(chǔ)數(shù)組元素值的和 ? ??????a[1]*=array[i];???????????????????????//存儲(chǔ)數(shù)組元素值的積 ? ???} ? ???//將數(shù)組的基地址賦值給整型指針 ? ???x=&a[0]; ? ???//返回整個(gè)數(shù)組 ? ???return?x; ? } ? ? int?main() ? { ? ???int?a[]={1,2,3,4}; ? ???int?*c;?c?=?Pool(a,4); ? ???printf("Sum?=?%d\nProduct?=?%d\n",c[0],c[1]); ? ???getch(); ? ???return?0; ? }? int?main() ? { ? ???int?a[]={1,2,3,4}; ? ???int?*c;?c?=?Pool(a,4);?? ? Pool(a,3);? //增加這句 ???printf("Sum?=?%d\nProduct?=?%d\n",c[0],c[1]); ? ???getch(); ? ???return?0; ? }?
這樣,你已經(jīng)學(xué)會(huì)了如何使用數(shù)組和指針從C函數(shù)中返回多個(gè)值。在很多情況下你會(huì)發(fā)現(xiàn)這個(gè)技巧很有用。
其實(shí)上面的用法是有問(wèn)題的,在C語(yǔ)言中絕不能返回函數(shù)內(nèi)局部變量的地址。
在c語(yǔ)言中,一種典型的錯(cuò)誤就是將一個(gè)指向局部變量的指針作為函數(shù)的返回值。由于該數(shù)組是局部變量,因此在函數(shù)返回時(shí)其數(shù)組空間已經(jīng)作廢了,即指針應(yīng)用一塊無(wú)意義的地址空間,所以不會(huì)有返回值。
如果得到正常的值,只能是幸運(yùn)的
退出函數(shù)的時(shí)候,系統(tǒng)只是修改了棧頂?shù)闹羔?#xff0c;并沒(méi)有清內(nèi)存;
所以,是有可能正常訪問(wèn)到局部變量的內(nèi)存的。
但因?yàn)闂J窍到y(tǒng)自動(dòng)管理的,所以該內(nèi)存可能會(huì)被分配給其他函數(shù),這樣,該內(nèi)存的內(nèi)容就會(huì)被覆蓋;不再是原來(lái)的值了。
得到的結(jié)果跟上面就不一樣了
總結(jié)
以上是生活随笔為你收集整理的C语言函数不能返回局部变量的地址的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何在【博客园】通过搜索 博主 昵称 来
- 下一篇: 什么是硬件设计?