筆試面試題目描述記憶體分配方式以及它們的區別

才智咖 人氣:1.08W

描述記憶體分配方式以及它們的區別

筆試面試題目描述記憶體分配方式以及它們的區別

1) 從靜態儲存區域分配。

記憶體在程式編譯的`時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static 變數。

2) 在棧上建立。

在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集。

3) 從堆上分配,亦稱動態記憶體分配。

程式在執行的時候用malloc 或new 申請任意多少的記憶體,程式設計師自己負責在何時用free 或delete 釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但問題也最多。

拓展:用縮寫的指標比較"if(p)" 檢查空指標是否可靠?如果空指標的內部表達不是0會怎麼樣?

當C 在表示式中要求布林值時, 如果表示式等於0 則認為該值為假, 否則為真。換言之, 只要寫出

if(expr)

無論“expr” 是任何表示式, 編譯器本質上都會把它當if((expr) != 0)處理。

如果用指標p 代替“expr” 則if(p) 等價於if(p != 0)。

而這是一個比較上下文, 因此編譯器可以看出0 實際上是一個空指標常數, 並使用正確的空指標值。這裡沒有任何欺騙; 編譯器就是這樣工作的, 併為、二者生成完全一樣的程式碼。空指標的內部表達無關緊要。

布林否操作符! 可如下描述:

!expr 本質上等價於(expr)?0:1

或等價於((expr) == 0)

從而得出結論

if(!p) 等價於if(p == 0)

類似if(p) 這樣的“縮寫”, 儘管完全合法, 但被一些人認為是不好的風格