内存四区

内存四区建立的流程

1、操作系统把物理硬盘代码load到内存

2、操作系统把c代码分成四个区

3、操作系统找到main函数入口执行


详细说明:

#include<stdio.h>
#include<stdlib.h>

char* getStr1()
{
	char *p1 = "abc"; //字符串常量放在常量区
	return p1;
}
char* getStr2()
{
	char *p2 = "abcd"; 
	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的值
	printf("p1:%d,p2:%d\n",p1,p2);

	//总结:指针变量和它所指向的内存空间变量是两个不同的概念
	system("pause");
	return 0;
}

#include<stdio.h>
#include<stdlib.h>

char* getStr1()
{
	char *p1 = "abc"; //字符串常量放在常量区
	return p1;
}
char* getStr2()
{
	char *p2 = "abc"; //字符串常量放在常量区 当放在全局区的常量相等的情况,编译器会优化保留一份
	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的值
	printf("p1:%d,p2:%d\n",p1,p2);//p1 p2的值相等 都指向同一块内存空间

	//总结:指针变量和它所指向的内存空间变量是两个不同的概念
	system("pause");
	return 0;
}



### C++ 内存的四个分区及其作用 #### 1. **栈区** 栈区是由编译器自动分配和释放的一块内存区域,主要用于存储函数调用过程中产生的局部变量、函数参数以及函数栈帧等信息。 - 局部变量:当进入某个函数时,该函数内的局部变量会被分配到栈上,在函数退出时这些变量会自动销毁[^4]。 - 函数参数:传递给函数的实际参数也会被压入栈中。 - 栈的特点是遵循“先进后出”的原则,因此其操作效率非常高。 示例代码: ```cpp void Test01(int a) { int b = 10; } ``` 在此例子中,`a` 和 `b` 都位于栈区内[^4]。 --- #### 2. **堆区** 堆区是一片由程序员手动管理的动态内存区域,用于在运行时通过显式的内存分配指令(如 `malloc` 或 `new`)获取额外的内存资源。 - 动态分配:程序员可以通过 `malloc`/`calloc`(C风格)或者 `new`(C++风格)来请求一块指定大小的内存空间[^2]。 - 手动释放:使用完成后需调用相应的释放函数(如 `free` 或 `delete`),否则可能导致内存泄漏。 - 堆区不依赖于任何特定的作用域范围,只要未被释放即可长期保留。 实例演示: ```cpp int* ptr = (int*)malloc(sizeof(int)); // 使用 malloc 分配单个整数类型的内存 if (ptr != nullptr) { *ptr = 5; free(ptr); // 记得释放已分配的内存 } // C++ 方式 int* p = new int[10]; // 在堆上分配十个整数单元 delete[] p; // 删除数组并回收相应内存 ``` --- #### 3. **全局/静态区 (.data/.bss 段)** 此部分分为两个子段——`.data` 和 `.bss`,分别用来保存不同特性的全局或静态数据项: ##### (1)**.data 段** 存放的是已经初始化过的全局变量与静态变量的数据值。例如: ```cpp int g_var = 0; // 存储于 .data 段 static int s_var = 0; // 同样属于 .data 段 ``` ##### (2)**.bss 段** 专门针对那些声明但尚未赋初值的零值化全局变量及静态变量而言。比如: ```cpp char *gp_var; // 定义却无初始设定,则放置于此处(.bss) static float f_static; // 默认为 0 的浮点型静态成员亦如此处理 ``` 两者共同构成了整个程序生命周期内始终存在的持久性储存位置集合[^1]。 --- #### 4. **常量区** 对于一些固定的数值表达式结果或者是字符串字面量等内容来说,它们往往会被安排至单独设立起来仅供读取访问权限限定下的专用区块之中。典型情况有以下几个方面: - 字符串常量:“abc”这样的字符串会被直接写死进可执行文件里头,并且每次引用它的时候都指向同一个固定地址[^5]; - 编译期计算得出的结果也可能驻留在这里等待后续利用。 举个简单的案例来看一下吧: ```cpp const char* str_literal = "Hello, World!"; ``` 这里的 `"Hello, World!"` 就处于只读数据段当中[^5]。 --- ### 总结表对比 | 区域名称 | 特点 | 生命周期 | |----------------|------------------------------------------------------------------------------------------|----------------------| | 栈区 | 自动分配释放,适合短期使用的局部变量 | 函数调用期间 | | 堆区 | 手工控制分配与释放过程 | 明确解除之前一直有效 | | 全局/静态区 | 初始设置好的永久性项目 | 整个项目周期 | | 常量区 | 不允许修改的内容 | 软件启动到关闭 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值