C語(yǔ)言棧區(qū)與堆區(qū)淺談

在編程中,內(nèi)存分為五大分區(qū):棧區(qū)內(nèi)存,堆區(qū),靜態(tài)區(qū),常量區(qū),代碼區(qū).

看下面一個(gè)函數(shù),你能發(fā)現(xiàn)它又什么問(wèn)題?又該如何改正?

char * getString() {

char str[20] = "iPhone";

return str;

}

首先,我們先來(lái)了解下五大分區(qū)的作用,然后上面的getString()函數(shù)的錯(cuò)誤,就迎刃而解了.

棧區(qū)內(nèi)存:是給函數(shù)里面的局部變量和形參分配內(nèi)存.當(dāng)發(fā)生函數(shù)調(diào)用時(shí),操作系統(tǒng)就會(huì)為這個(gè)函數(shù)里面的所有局部變量和形參分配內(nèi)存, 當(dāng)函數(shù)調(diào)用完畢時(shí), 所有為這個(gè)函數(shù)分配的棧區(qū)內(nèi)存就會(huì)被系統(tǒng)回收.

堆區(qū):由程序員自己負(fù)責(zé)分配和釋放. 有分配就得有釋放, 否則會(huì)導(dǎo)致內(nèi)存泄露

靜態(tài)區(qū):用static修飾的變量和全局變量會(huì)被分配在靜態(tài)區(qū),靜態(tài)區(qū)內(nèi)存由操作系統(tǒng)負(fù)責(zé)分配和釋放(并且使用static修飾的變量只會(huì)被初始化一次)

常量區(qū):代碼里寫(xiě)的數(shù)值常量,字符串常量,都是存儲(chǔ)在常量區(qū)的,常量區(qū)的內(nèi)存也是操作系統(tǒng)負(fù)責(zé)分配和釋放.常量區(qū)的最大特點(diǎn)是內(nèi)容不可修改.

我們已經(jīng)了解了五大分區(qū)每個(gè)分區(qū)的特性,那么接下來(lái),我們來(lái)分析一下getString()函數(shù)錯(cuò)在哪里?

在getString函數(shù)中:char str[20]= "iPhone";定義了一個(gè)長(zhǎng)度為20的字符數(shù)組,因?yàn)槭呛瘮?shù)里面的局部變量,因此它的內(nèi)存是在棧區(qū)存放,也就是說(shuō),現(xiàn)在棧區(qū)里面申請(qǐng)了一塊內(nèi)存區(qū)域用來(lái)存放getString函數(shù)里面的局部變量,"iPhone"這個(gè)字符數(shù)組也就保存在了這個(gè)棧區(qū)內(nèi)存.

接下來(lái)return str;返回?cái)?shù)組的地址.函數(shù)調(diào)用結(jié)束后,系統(tǒng)將會(huì)對(duì)棧區(qū)的getString的內(nèi)存進(jìn)行回收.也就是說(shuō),返回的str這個(gè)指針指向數(shù)組已經(jīng)不存在了.那么我們?cè)撊绾胃倪M(jìn)才能拿到這個(gè)"iPhone"字符數(shù)組呢?

這就需要利用堆區(qū)的特性來(lái)進(jìn)行改進(jìn).改進(jìn)后函數(shù)如下:

char * getString() {

???????? char * str = malloc(10) ;//動(dòng)態(tài)申請(qǐng)一個(gè)堆區(qū)內(nèi)存,來(lái)存儲(chǔ)字符

???????? strcpy(str , "iPhone");//把常量區(qū)的"iPhone"字符拷貝到堆區(qū)的內(nèi)存中

????????? return str;//返回的是堆區(qū)的地址

}

通過(guò)這樣改進(jìn)后我們就能拿到一個(gè)指向堆區(qū)的指針.(調(diào)用過(guò)這個(gè)函數(shù)后,要記得釋放free(); )

char * getString() {

char str[20] = "iPhone";

return str;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (JG-2014-08-20)(前半部分經(jīng)過(guò)網(wǎng)上多篇文章對(duì)比整理)(后半部分根據(jù)ExceptionalCpp、C+...
    JasonGao閱讀 5,744評(píng)論 2 23
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛(ài)DE問(wèn)候閱讀 1,846評(píng)論 0 4
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 2,255評(píng)論 0 7
  • 多線(xiàn)程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,131評(píng)論 0 12
  • 前年,信誓旦旦說(shuō)好的我到北京考試時(shí),帶你去玩。后來(lái),因?yàn)檎?qǐng)假?zèng)]有批準(zhǔn),這事就算黃了。 “這事”多好啊,到過(guò)北京,又...
    四色麒麟閱讀 423評(píng)論 1 2

友情鏈接更多精彩內(nèi)容