去參加筆試了,有兩道題做錯了,都是印象裡面有概念,但是沒有弄清楚它到底是怎麼回事,原理是什麼,導致題目打錯,現總結一下。
一、C++內存分配筆試考察
問題考察如下,請先不要看答案,看看你能否做對,呵呵:
怎麼樣,暈了沒?正確答案及解析如下:
解析:char p[] = “...”是一個數組,這個數組是局部變量。char *p = “...”,是一個指針,這個指針指向一個字符串常量。區別在於:數組的話,字符串是存在這個數組裡的,因為這個數組屬於局部變量(存在棧區),而當該函數執行完,位於棧區的局部變量就銷毀了,就算把數組的地址返回給主函數,主函數也無法訪問到原有字符串了,應該輸出亂碼。但是,如果是指向字符串常量的指針,這個字符串是放在程序的常量區而不是放在局部變量中,那麼把這個常量的地址返回給主函數,主函數也是可以訪問它的。
下面就針對C++中的內存分配做個總結:
一個C/C++編譯的程序占用的內存分為以下幾個部分:
1. 棧區(stack)
由編譯器自動分配釋放,存放函數地址、函數參數值、局部變量的值等。
2. 堆區(heap)
就是那些由new分配的內存塊,他們的分配與釋放由程序員負責,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
3. 全局/靜態區(static)
全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和初始化的靜態變量在一塊區域,為初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束後由系統釋放。
4. 常量存儲區(const)
常量字符串就是放在這裡的。
5. 程序代碼區
存放函數體的二進制代碼。
其中,堆棧的主要區別如下:
爽歪歪了吧,下面就來看第二個問題吧。。。
《C++ 設計新思維》 下載見 http://www.linuxidc.com/Linux/2014-07/104850.htm
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中:
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-02/112883p2.htm