這個(gè)從函數(shù)調(diào)用是堆棧的變化說(shuō)吧,函數(shù)調(diào)用的時(shí)候,系統(tǒng)會(huì)將函數(shù)的返回地址、參數(shù)壓入系統(tǒng)棧中,然后跳轉(zhuǎn)到函數(shù)的代碼區(qū)開(kāi)始執(zhí)行你函數(shù)里面寫的代碼。
成都創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)10年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)營(yíng)銷推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:柴油發(fā)電機(jī)等企業(yè),備受客戶稱贊。
這個(gè)時(shí)候,子函數(shù)才會(huì)去向系統(tǒng)申請(qǐng)堆空間存放你在這個(gè)函數(shù)中定義的變量,這些空間(變量)是有生命周期的,到這個(gè)子函數(shù)執(zhí)行完畢,它的生命周期就結(jié)束了,申請(qǐng)的堆空間就會(huì)被釋放,這個(gè)時(shí)候你指向它的指針當(dāng)然是無(wú)效的;
而可以返回局部變量的原因是,你子函數(shù)的返回值(子函數(shù)局部變量),會(huì)被當(dāng)作父函數(shù)的局部變量處理,它在堆中可以存放至父函數(shù)執(zhí)行完畢,所以它是有效的.
在C語(yǔ)言中,局部變量的作用域只在函數(shù)內(nèi)部,在函數(shù)返回后,局部變量的內(nèi)存就會(huì)被釋放。如果函數(shù)只是返回局部變量,那么這個(gè)局部變量會(huì)被復(fù)制一份傳回被調(diào)用處。但是如果函數(shù)返回的是局部變量的地址,那么就會(huì)報(bào)錯(cuò),因?yàn)楹瘮?shù)只是把指針復(fù)制后返回了,但是指針指向的內(nèi)容已經(jīng)被釋放,這樣指針指向的內(nèi)容就是不可預(yù)料的內(nèi)容,程序就會(huì)出錯(cuò)。準(zhǔn)確的來(lái)說(shuō),函數(shù)不能通過(guò)返回指向棧內(nèi)存的指針(返回指向堆內(nèi)存的指針是可以的)。
首先你要理解運(yùn)行時(shí)執(zhí)行棧的概念,運(yùn)行在一個(gè)函數(shù)中的時(shí)候,局部變量是依次壓在棧區(qū)的,函數(shù)返回后釋放,相同的地址可能被下一個(gè)運(yùn)行的函數(shù)中的局部變量重用。
如果注釋掉fun2,你只調(diào)用了fun1,局部變量p1的值為fun1里面j所占的地址,內(nèi)容為5,返回后p=p1, *p 為 5,
如果不注釋掉fun2, fun1退出后,執(zhí)行棧上繼續(xù)運(yùn)行fun2.由于fun1的j和fun2的j1所在的偏移相同,它們?cè)趯?shí)際內(nèi)存中所占的地址也是相同的,所以p2的值,也就是fun2的j1的地址,也就是fun1的j的地址,它的內(nèi)容被改為10,所以p現(xiàn)在等于p1等于p2等于j1的地址等于j的地址,所以內(nèi)容是10
另外,你這個(gè)程序肯定是錯(cuò)的,別這么寫,考試肯定掛,上班肯定被開(kāi)除
會(huì)自動(dòng)釋放,指針也是一樣的。
局部變量的作用域是定義該變量的函數(shù)或定義該變量的復(fù)合語(yǔ)句。只在定義它的函數(shù)或復(fù)合語(yǔ)句范圍內(nèi)有效,只能在定義它的函數(shù)或復(fù)合語(yǔ)句內(nèi)才能使用它們。局部變量的生存期是從函數(shù)被調(diào)用的時(shí)刻算起到函數(shù)返回調(diào)用處的時(shí)刻結(jié)束。
擴(kuò)展資料:
局部變量的作用域說(shuō)明:
1、主函數(shù)main()中定義的變量也只在主函數(shù)中有效,而不能因?yàn)樵谥骱瘮?shù)中定義在整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),它與其他函數(shù)是平行關(guān)系。這一點(diǎn)是與其他語(yǔ)言不同的,應(yīng)予以注意。
2、不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象,分配不同的單元,互不干擾。例如,上面在f1函數(shù)中定義了變量b和c,倘若在f2函數(shù)中也定義變量b和c,它們?cè)趦?nèi)存中占不同的單元,互不干擾。
3、形式參數(shù)是屬于被調(diào)函數(shù)的局部變量。例如上面f1函數(shù)中的形參a,也只在f1函數(shù)中有效,其他函數(shù)可以調(diào)用f1函數(shù),但不能引用f1函數(shù)中的形參a。
4、在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語(yǔ)句中定義變量,這些變量只在本復(fù)合語(yǔ)句中有效,這種復(fù)合語(yǔ)句也稱為“分程序”或“程序塊”。
參考資料來(lái)源:百度百科-局部變量
主函數(shù)的局部變量 的釋放時(shí)間 和全局變量 是不一樣的。
全局變量的有效時(shí)間早于 main 函數(shù)。
實(shí)際上程序運(yùn)行的最開(kāi)始是要執(zhí)行一系列初始化過(guò)程,這就包括了對(duì)全局變量進(jìn)行初始化。
當(dāng)所有全局變量初始化完成后,才開(kāi)始執(zhí)行main函數(shù)。
main函數(shù)開(kāi)始執(zhí)行后,main函數(shù)內(nèi)的局部變量才開(kāi)始初始化。
main函數(shù)退出時(shí),局部變量被釋放,生命周期結(jié)束,但這時(shí)候全局變量依然是存在的。
當(dāng)main函數(shù)退出完畢后,這個(gè)程序并沒(méi)有徹底結(jié)束,它還要執(zhí)行一系列的收尾工作,其中就包括釋放所有全局變量。