在編程中,記憶體分為五大磁區:堆疊區記憶體,堆區,靜態區,常量區,代碼區.
看下面一個函式,你能發現它又什么問題?又該如何改正?
char * getString() {
char str[20] = "iPhone";
return str;
}
首先,我們先來了解下五大磁區的作用,然后上面的getString()函式的錯誤,就迎刃而解了.
堆疊區記憶體:是給函式里面的區域變數和形參分配記憶體.當發生函式呼叫時,作業系統就會為這個函式里面的所有區域變數和形參分配記憶體, 當函式呼叫完畢時, 所有為這個函式分配的堆疊區記憶體就會被系統回收.
堆區:由程式員自己負責分配和釋放. 有分配就得有釋放, 否則會導致記憶體泄露

靜態區:用static修飾的變數和全域變數會被分配在靜態區,靜態區記憶體由作業系統負責分配和釋放(并且使用static修飾的變數只會被初始化一次)
常量區:代碼里寫的數值常量,字串常量,都是存盤在常量區的,常量區的記憶體也是作業系統負責分配和釋放.常量區的最大特點是內容不可修改.
我們已經了解了五大磁區每個磁區的特性,那么接下來,我們來分析一下getString()函式錯在哪里?
在getString函式中:char str[20]=
"iPhone";定義了一個長度為20的字符陣列,因為是函式里面的區域變數,因此它的記憶體是在堆疊區存放,也就是說,現在堆疊區里面申請了一塊記憶體區域用來存放getString函式里面的區域變數,"iPhone"這個字符陣列也就保存在了這個堆疊區記憶體.

接下來return str;回傳陣列的地址.函式呼叫結束后,系統將會對堆疊區的getString的記憶體進行回收.也就是說,回傳的str這個指標指向陣列已經不存在了.那么我們該如何改進才能拿到這個"iPhone"字符陣列呢?
這就需要利用堆區的特性來進行改進.改進后函式如下:
如果你在學習C/C++的程序中遇到了問題,可以來加入小編的企鵝圈問小編哦~小編很熱情的(●’?’●)
char * getString() {
char * str = malloc(10) ;//動態申請一個堆區記憶體,來存盤字符
strcpy(str , "iPhone");//把常量區的"iPhone"字符拷貝到堆區的記憶體中
return str;//回傳的是堆區的地址

}
通過這樣改進后我們就能拿到一個指向堆區的指標.(呼叫過這個函式后,要記得釋放free(); )
char * getString() {
char str[20] = "iPhone";
return str;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/203876.html
標籤:C
