当前位置: 首页 > news >正文

C/C++ 内存管理

Hello!!大家早上中午晚上好!!!今天我们来复习C/C++的内存管理部分!!!

一、做几个题测试对内存分布的掌握

答案:

1.1说明:

栈区用来存放非静态局部变量、函数参数、返回值等,栈区是向下增长的;

堆区用来存放程序运行时动态内存分配,栈区是向上增长的;

数据段也叫(静态区),用来存放全局数据、静态数据;

代码段也叫(常量区),用来存放可执行代码、只读常量;

内存映射段用来做进程间通信;

二、malloc、calloc、realloc的区别

2.1malloc向系统申请字节数大小的空间,申请成功返回申请好的空间的地址,申请失败返回NULL;
int main()
{
	int* p1 = (int*)malloc(sizeof(int));//申请一个int大小的空间
	if(p1==NULL)//如果申请失败返回空
	{
		perror("malloc error!!");
        return 0;
	}
    *p1=10;
	int* p2 = (int*)malloc(20);//申请20字节大小的空间
	if (p2==NULL)
	{
	    perror("malloc error!!!");
        return 0;
	}
	*(p2+1)=10;
    free(p1);
    p1=NULL;
    free(p2);
    p2=NULL;
	return 0;
}

2.2calloc用来申请内存并初始化
int main()
{
	int* p1 = (int*)calloc(10,sizeof(int));
	if (p1 == NULL)
	{
		perror("calloc error!!!");
			return 0;
	}
	int* p2 = (int*)calloc(4, 5);
	if (p2 == NULL)
	{
		perror("calloc error!!!");
		return 0;
	}
	free(p1);
	p1 = NULL;
	free(p2);
	p2 = NULL;
	return 0;
}

   calloc函数原型:void*calloc(size_t num,size_t size);calloc的用法:申请开辟num个内存大小为size字节的空间并初始化0,如果申请失败返回NULL,如果申请成功返回开辟好的空间的地址;

2.3realloc

realloc 函数原型: void * realloc(void* ptr,size_t size);

简单演示:


int main()
{
	int* p1 = (int*)malloc(sizeof(int) * 10);//开10个int大小空间
	if (p1 == NULL)
	{
		perror("malloc error!!!");
		return 0;
	}
	
	//给这个10个空间从0开始赋值,并打印
	int* start1 = p1;
	for (int i = 0; i < 10; i++)
	{
		*p1 = i;
		p1++;
	}
	p1 = start1;
	for (int i = 0; i < 10; i++)
	{
		cout << *p1 << " ";
		++p1;
	}
	cout << endl;

	//把p1指向空间再扩容10个int大小
	p1 = start1;
	int* p2 =(int*) realloc(p1, sizeof(int) * 20);
	if (p2 == NULL)
	{
		perror("realloc error!!!");
		free(p1);//如果扩容失败释放旧地址
		p1 = NULL;
		return 0;
	}

	//扩容成功
	//扩容成功有两种可能:1、原地扩 2、原地空间不够异地扩,把旧地址空间内容拷贝过来并释放旧空间
	p1 = p2;  //避免对旧地址的访问,把旧指针也指向新地址
	int* start2 = p2 + 10; //从新空间的第11个int开始赋值,并打印
	for (int i = 0; i < 10; i++)
	{
		*start2 = i;
		++start2;
	}
	for (int i = 0; i < 20; i++)
	{
		cout << *p1 << " ";
		p1++;
	}
	cout << endl;
	return 0;
}

运行:

注意:

①realloc必须在malloc、calloc、realloc出来的空间上进行调整;

②当realloc的第一个参数(需要调整的空间的地址)为NULL时,realloc相当于malloc;

③当realloc的第二个参数(需要调整的空间大小)为0时,realloc相当于free(ptr);

	
int main()
{
int* ptr1 = (int*)malloc(sizeof(int) * 5);
	if (ptr1 == NULL)
	{
		perror("malloc error!!!");
		return 0;
	}
	int* cur1 = ptr1;
	for (int i = 0; i < 5; i++)
	{
		*cur1 = i;
		cout << *cur1;
		++cur1;
	}
	cout << endl;
	int* ptr2 = (int*)realloc(ptr1, 0);
if(ptr2==NULL)
{
    perror("realloc error!!!");
}
	for (int i = 0; i < 5; i++)
	{
		cout << *ptr1<<" ";//对已释放空间的访问!!
		ptr1++;
	}
	return 0;
}

运行:

相关文章:

  • 马斯克:AI游戏前景无限
  • 大模型+知识图谱:重塑企业制度标准管理
  • C++方向的面经
  • Self-Supervised Prompt Optimization
  • HTTP协议(20250305)
  • 设计模式:迭代器模式
  • Oracle常用分析诊断工具(9)——AWR
  • 杨辉三角解法
  • BambuStudio学习笔记:MeshBoolean类
  • C#+Halcon 检测稳定性提升的方式
  • docker:配置 Docker 镜像加速器
  • 计算机毕业设计SpringBoot+Vue.js校园网上店铺(源码+文档+PPT+讲解)
  • Webpack分包与合包深度解析
  • 面试基础--Spring Boot启动流程及源码实现
  • 【AI】【Unity】关于Unity接入DeepseekAPI遇到的坑
  • 全网独家:zabbixV7版本容器服务器无法访问Postgres V17数据库的问题解决
  • 启智平台华为昇腾910B 运行DeepSeek Janus-Pro-7/1B
  • 高并发应用分层架构
  • C#调用Ni板卡进行实现采集任务(模拟量输入输出)示例1
  • 分布式事务【整理、总结】
  • 怎么在导航网站上做推广/优化设计答案六年级
  • 门户网站宣传方案/十大技能培训机构排名
  • 临沂哪里做网站比较好/客户管理软件哪个好用
  • 邀请码网站怎么做/体验营销
  • 宁波汽车网站建设/接广告的平台
  • ceos 6.8安装wordpress/seo优化的网站