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