預(yù)備知識:內(nèi)存的分類C/C++程序占用的內(nèi)存分為兩大類: 數(shù)據(jù)保存在靜態(tài)存儲區(qū)與動態(tài)存儲區(qū)的區(qū)別就是:靜態(tài)存儲區(qū)在 在其它地方我們還可以看到內(nèi)存分配還有其他分類,那些都是細(xì)分的分類,比如文字常量區(qū)、全局?jǐn)?shù)據(jù)區(qū)等,都?xì)w為靜態(tài)存儲區(qū)這一個大類。 關(guān)于內(nèi)存的分類這里只是大致說一下,關(guān)于內(nèi)存更詳細(xì)的內(nèi)容可查看往期筆記:【C語言筆記】內(nèi)存總結(jié) 例子:return返回指向棧內(nèi)存指針先看一個return返回指向棧內(nèi)存指針的例子: #include <stdio.h> 程序編譯、運行的結(jié)果如下: 可以看到,編譯出現(xiàn)警告:
運行結(jié)果并不是我們期望的輸出字符串 那是因為 下面我們把 char *GetStr(void) 此時編譯運行的結(jié)果是怎樣的呢?結(jié)果為: 可以看到能正常輸出。為什么這里又可以正常輸出呢?因為這里的p雖然分配在棧上,但是此時的 這里可能有些人會有疑惑,同樣是 char *p = "Hello"; 此處首先定義了一個指針變量p,編譯器就會為指針變量開辟了??臻g。而此時并沒有空間來存放 char p[] = "Hello"; 此處首先定義一個數(shù)組p,因為未給出數(shù)組大小,所以此時數(shù)組大小未確定。然后把 相關(guān)筆記:char *str與char str[]的區(qū)別 其它替代方法從上面的例子我們知道,若函數(shù)返回指向棧內(nèi)存的指針,所得到的結(jié)果并不是我們想要的。除了上面的方法之外,這里還有如下幾種解決方法: |
|