佛山网站建设策划,服装设计网站有哪些推荐,百度关键词优化的意思,wordpress自定义模块自定义字段C核心编程内存分区模型1.内存分区模型1.1内存分区模型概述1.2内存分区的意义1.3程序允许前1.3.1代码区1.3.2全局区1.3.2.1全局区的演示1.4程序运行后1.4.1栈区1.4.1.1栈区演示1.4.2堆区1.4.2.1堆区演示1.5new操作符1.5.1new操作的概述1.内存分区模型
1.1内存分区模型概…
C核心编程内存分区模型1.内存分区模型1.1内存分区模型概述1.2内存分区的意义1.3程序允许前1.3.1代码区1.3.2全局区1.3.2.1全局区的演示1.4程序运行后1.4.1栈区1.4.1.1栈区演示1.4.2堆区1.4.2.1堆区演示1.5new操作符1.5.1new操作的概述1.内存分区模型
1.1内存分区模型概述
C程序在执行时将内存大方向分为4个区域 代码区: 存放函数体的二进制代码由操作系统进行管理的全局区: 存放全局变量和静态变量以及常量栈区: 由编译器自动分配释放存放函数的参数值、局部变量等堆区: 由程序员分配和释放若程序员不释放程序结束时由操作系统回收
1.2内存分区的意义
不同区域存放的数据赋予不同的生命周期
1.3程序允许前
在程序编译后生成看exe可执行文件未执行该程序前分为两个区域
1.3.1代码区
存放CPU执行的机器指令代码区是共享的共享的目的是对于频繁被执行的程序只需要在内存中有一份代码即可代码区是只读的使其只读的原因使防止程序意外地修改了它的指令
1.3.2全局区
全局变量和静态变量存放在此全局区还包含了常量区字符串常量和**其他常量(const修饰的全局变量)**也存放在此该区域的数据在程序结束后由操作系统释放
1.3.2.1全局区的演示
#includeiostream
using namespace std;//全局变量
int gNum 123;const int cgNum 123;int main()
{// 静态变量static int sNum 123;//常量//字符串常量// 就是一个普通的字符串// const修饰的变量//const 修饰的局部变量const string cstr 富甲一方钱七;//创建普通局部变量int num 123;cout num的局部变量内存地址为: num endl;cout gNum全局变量的内存地址为: gNum endl;cout sNum静态变量的内存地址为: sNum endl;cout 字符串常量的地址为: 法外狂徒张三 endl;cout const修饰的全局变量的地址为: cgNum endl;cout const修饰的局部变量地址为: cstr endl; //内存地址与num局部变量地址很近system(pause);return 0;
}1.4程序运行后
1.4.1栈区
由编译器自动分配释放存放函数的参数值、局部变量等注意事项: 不要返回局部变量的地址栈区开辟的数据由编译器自动释放
1.4.1.1栈区演示
#includeiostream
using namespace std;// 栈区数据注意事项 --- 不要返回局部变量的地址
// 栈区的数据由编译器管理开辟和释放int* func();int main()
{int* p func();cout *p endl; // 23 第一次可以打印正确的数字是因为编译器做了一次保留cout *p endl; // 2073663880system(pause);return 0;
}int* func()
{int num 23; // 局部变量 存放在栈区栈区的数据在函数执行完后自动释放return num;}1.4.2堆区
由程序员分配释放若程序员不释放程序结束时由操作系统回收在c中主要利用new在堆区开辟内存
1.4.2.1堆区演示
#includeiostream
using namespace std;int* func();int main()
{int* p func();cout *p endl; // 123cout *p endl; // 123system(pause);return 0;
}int* func()
{// 利用new关键字 可以将数据开辟到堆区// 指针 本质也是局部变量放在栈上指针保存的数据放在堆区// new int(123) 开辟的空间返回的是指针int* p new int(123);return p;
}1.5new操作符
1.5.1new操作的概述
C利用new操作符在堆区开辟数据堆区开辟的数据由程序员手动开辟手动释放释放利用操作符delete#includeiostream
using namespace std;int* func();int main()
{int* p func();cout *p endl; // 123cout *p endl; // 123system(pause);return 0;
}int* func()
{// 利用new关键字 可以将数据开辟到堆区// 指针 本质也是局部变量放在栈上指针保存的数据放在堆区int* p new int(123);return p;
}语法new 数据类型利用new创建的数据会返回该数据对应的类型的指针#includeiostream
using namespace std;
int* func();
void test_1();
void teste_2();int main()
{test_1();system(pause);return 0;
}// 在堆区利用new开辟数据空间
int* func()
{// 利用new关键字开启的数据类型返回都是指针int* p new int(123);return p;
}
void test_1()
{int* p func();cout *p endl; // 123//堆区的数据 由程序员管理开辟程序员管理释放//如果想释放堆区的数据利用关键词deletedelete p;// cout *p endl; // 引发了异常: 读取访问权限冲突。
}
// 在堆区利用new开辟数组
void test_2()
{// 创建10整型数据的数组在堆区// 返回连续空间的指针的首地址int* arr new int[10];// 释放堆区的数组// 释放数据需要加[] 释放delete[] arr;
}