程序的内存模型
- 代码区:程序运行前就有,存所有01代码,权限是共享的(执行多次)、只读的(防止钱被修改)
- 全局区:程序运行前就有,由操作系统管,存全局变量、静态变量和常量(程序结束后释放)
//全局变量:与main()并列 //普通局部变量:函数体内,包括main() int a=10; int b=10; //静态变量:普通局部变量前加static static int s_a=10; //常量:1、“引起”字符串常量2、const常量:修饰全局变量和修饰局部变量
- 栈区:程序运行后才有,系统管的生死簿,存形参、局部变量(执行后自动释放)
//不要返回局部变量的地址 int * func(){ int a=10; return &a;//返回局部变量地址 } int main(){ int * p=func(); cout<<*p<<endl;//=10 cout<<*p<<endl;//≠10,已经被释放,两次输出结果不同 }
- 堆区:程序运行后才有,程序运行期间我管的生死簿,工具new开辟
//与栈区对比 int * func(){ int * p=new int(10);//rj:不用p接行不行? return p;//返回局部变量地址 } int main(){ int * p=func(); cout<<*p<<endl;//=10 cout<<*p<<endl;//=10 }
开辟new:new int类型10;new int(10);返回值是指针; 释放用delete p;释放后没有权限访问
//堆区开辟整型数据的数组 int * arr=new int[10];//10代表10个元素,用数组指针接收 //赋值 for(int i=0;i<10;i++){ arr[i]=i+100; } //输出 for(int i=0;i<10;i++){ cout<<arr[i]<<endl; } //释放堆区数组 delete[] arr;//[]:告诉编译器释放的是数组