IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 0.语言内存四区模型: -> 正文阅读

[C++知识库]0.语言内存四区模型:

1.内存四区模型

各区元素分析

栈区:由编译器自动释放,存放函数参数的值,局部变量的值等。

堆区:一般由程序员分配和释放(动态的内存申请和释放),若程序员不释放,程序结束时可能? ? ? ? ? ? ? ? 由操作系统自动回收

全局区(静态区):存放全局变量和静态变量;初始化的全局变量和静态变量放在全局区的一块? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 区域中;未初始化的全局变量和静态变量放在另一块区域中,程序结束后有? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 操作系统释放

常量区:字符串常量和其他常量的存放位置,程序结束后由操作系统释放(属于静态区的中的常? ? ? ? ? ? ? ? ? 量区)

代码区:存放函数体的二进制代码

2.静态存储区

char* getStr1()
{
	char* p1= "acbde";
	return p1;
}
char* getStr2()
{
	char* p2 = "ac";
	return p2;
}
int main()
{
	char* p1=NULL;
	char* p2 = NULL;
	p1 = getStr1();
	p2 = getStr2();
	//打印p1,p2所指向内存空间的数据
	printf("p1:%s  p2:%s\n", p1, p2);
	//打印p1,p2的值(p1,p2的地址)
	printf("p1:%d  p2:%d\n", p1, p2);
	//错误写法
	//printf("p1:%s  p2:%s\n", *p1, *p2);
	return 0;
}

?注:1)指针指向谁就将谁的地址赋给指针

? ? ? ? ?2)当示例中的指针p1和p2所指向的内存空间保存的数据一样时,p1和p2的值相同。即p1? ? ? ? ? ? ? ? ? 和p2所指向的内存空间是同一块区域。(相同的数据在静态存储区中只会开辟一次内存)

? ? ? ? ?3)若p1为一个地址则以%s,%c格式打印,打印p1,打印的是p1所指向的内存中的数据,若? ? ? ? ? ? ? ? 给p1赋值为为字符型获知字符串类型的数据,则是给p1所指向的内存空间进行赋值。? ? ? ? ? ? ? ? ? ? 以%d格式打印,则打印的是p1的值

? ? ? ? ?4) 指针变量和指针所指向的内存空间变量是两个不同的概念

3.堆区/栈区

//堆区开辟空间
char* getStr1(int capacity)
{
	char* p1 = NULL;
	p1 = (char*)malloc(capacity * sizeof(char));
    p1 = "123456";
	if (p1 == NULL)
	{
		printf("err:mollc");
	}
	return p1;
}
//栈区开辟空间---不合理
char* getStr2()
{
	char buf[64]="123456789";
	return buf;
}
int main()
{
	char* temp=NULL;
	temp = getStr1(10);
	if (temp == NULL)
	{
		printf("err");
	}
	char* p3 = temp;
	printf("temp:%c   p3:%c\n", temp,p3);//123456 123456
	printf("temp:%d   p3:%d\n", temp,p3);//33789  33789
	temp = getStr2();
	printf("%s\n", temp);//有可能出现宕机或不正常的输入
	return 0;
}

注:1)使用字符串和字符对对字符指针进行赋值时:使用p而非*p

? ? ? ?2)? malloc申请的内存空间在堆区

? ? ? ?3)数组的内存空间开辟在栈区,函数执行完毕,数组所占的内存空间会被释放

? ? ? ?4)int * temp = (char*)malloc(sizeof(char)*5);//int类型的指针temp指向堆区中开辟的? ? ? ? ? ? ? ? ? ? ? 保存5个char类型数据的的地址空间的首地址

? ? ? ?5)一般情况下:栈的开口是向下的

? ? ? ?6) 数组的地址永远是从小到大

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 18:44:48  更:2022-05-21 18:47:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/20 17:43:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码