先看看這張圖里面五個區域
就我自己的思考來設置一些問答。
1. 首先哪些變量會進行零初始化?
如果沒有顯示地初始化靜態變量,編譯器將把它設置為0,在默認情況下,靜態數組和結構將每個元素或成員的所有位都設置為0。
2. char *p = "hello" 和 char p[6] = "hello"有什么區別?
char *p = "hello", 對於*(p + 1) = 'a'這條語句是無法執行的,因為hello保存在常量字符串區,當你初始化賦值的時候,這些常量就先在文字常量區開辟一段空間,保存此常量,定義后是不能修改的。以后相同的常量就都在這里了。
char p[6] = "hello",保存在棧區, 可以進行修改,空間由編譯器自動分配和釋放。
3. 五種變量存儲方式?
存儲描述 | 持續性 | 作用域 | 鏈接性 | 如何聲明 | 其他信息 |
自動 | 自動 | 代碼塊 | 無 | 在代碼塊中 | 比如一些局部變量 |
寄存器 | 自動 | 代碼塊 | 無 | 在代碼塊中,使用關鍵字register | |
靜態,無鏈接性 | 靜態 | 代碼塊 | 無 | 在代碼塊中,使用關鍵字static | 在函數內,函數退出,值仍然保留 |
靜態,外部鏈接性 | 靜態 | 文件 | 外部 | 不在任何函數內 | extern |
靜態,內部鏈接性 | 靜態 | 文件 | 內部 | 不在任何函數內,使用關鍵字static | 所有函數共用 |
4. const的一些問題。
const修飾的全局變量保存在代碼區中,const修飾的局部變量保存在棧段中。
默認情況下,全局變量的鏈接性為外部的(其他文件要使用這個全局變量加上extern關鍵字), 而const修飾的全局變量是內部鏈接的,就像使用了static一樣。
5. 存儲說明符介紹。
auto——在C++11之前是說明符, 顯式指出變量為自動存儲,現在是用於類型推斷,可以不考慮
register——使用CPU寄存器來存儲變量,提高變量訪問的速度
static——創建靜態的內部鏈接性、靜態無鏈接性的變量
extern——創建靜態外部鏈接性的變量
thread_local——C++11新增,變量的持續性與線程相同
mutable——可以用它來指出,即使結構(或類)變量為const,其某個成員也可以被修改
6. 棧區的詳細說明。
由於自動變量的數目隨函數的開始和結束而增減,因此程序必須在運行時對自動變量進行管理。常用的方法是留出一段內存,並將其視為棧。程序使用兩個指針來跟蹤棧,一個指針指向棧底,另一個指針指向棧頂(下一個可用的內存單元)。當函數被調用時,將自動變量加入到棧中,棧頂指針指向變量后面的下一個可用的內存單元。函數結束時,棧頂指針被重置為函數被調用前的值,從而釋放新變量使用的內存。
7. 我之前的一個小小的疑惑
局部變量全部都是存儲在棧區的,但是malloc分配的內存在堆區,那么int *p = new int[5];這種應該分配在棧區還是堆區呢?當然是p在棧區,存一個地址,地址對應的地方在堆區。