1、stack(棧)
編譯器自動分配內存(函數內部定義得局部變量、形參)
2、堆(Heap)
一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收(new和delete)
3、Global\Static(全局區、靜態區)
1、全局變量和靜態變量的存儲是放在一塊兒的
2、可以簡單認為:程序啟動全局/靜態變量就在此處、程序結束釋放
4、Constant(常量區)
可以理解為所有常量都放在一起,該區域內容不可修改、
c++內存示例:
堆向高地址方向生長
棧向低地址方向生長
所以中間的空白區域會由兩者共享,增大了內存的利用效率。
觀察變量存放位置;
問題:
下面哪個語句可以接在const char* p = “Hello”;后面:
1、p[0]=‘A’
2、p = “World”;
3、cin>>p
4、*(p+1)=‘e’
1和4共同的問題:表達式必須是可以修改的左值
運算符的左邊應該是一個“左值”。所謂“左值”就是指在程序中占用內存空間、可以被修改的量,比如各種變量。
‘’A‘’是一個字符串常量,他一經定義系統就會分配一段地址給他(常量區)式子左邊p[0]也是一個常量地址,所以不能用 = 將一個常量地址賦值給一個常量地址。這也就能回答問題:表達式必須是可修改的左值的答案,因為p[0]也是一個常量地址。
3、符號方向反了
關于1、4問題的詳細解釋看這篇文章:
C語言中字符串賦值處理方式
char *p,a='5';
p=&a; //顯然是正確的,
p="abcd"; //但為什么也可以這樣賦值??
雙引號做了3件事:
1.申請了空間(在常量區),存放了字符串
2. 在字符串尾加上了’/0’
3.返回地址
這里就是 返回的地址 賦值給了 p