首页 > 系统相关 >动态内存开辟--在堆区进行开辟存储

动态内存开辟--在堆区进行开辟存储

时间:2024-01-07 21:32:23浏览次数:34  
标签:malloc NULL -- 堆区 int 空间 include 开辟

1.malloc值
//1.malloc--开辟好的空间如果还没有使用,则都默认为随机值
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
int main()
{
	//向堆区内存申请开辟是个整型内存的空间,开辟的空间首地址交给指针p
	//int* p = (int*)malloc(10*sizeof(int));
	int* p = (int*)malloc(40);//malloc和free要成对使用
	if (p == NULL)
	{
		printf("%s",strerror(errno));
		//如果malloc失败就把失败原因显示出来
	}
	else
	{
		for (int i = 0; i < 10; i++)
		{
			*(p + i) = i;
		}
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	free(p);//把p指向的空间释放掉
	p = NULL;//把p指向的地址之间联系断掉--否则可能会内存泄露
	return 0;
}
2.free释放不需要占用的动态内存,要和malloc搭配使用
3.calloc

calloc--在堆区开辟的空间默认值为0 ,当空间不足开辟时,将会返回一个NULL;

#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
int main()
{
	int *p=(int *)calloc(10, sizeof(int));
	if (p == NULL)
	{
		printf("%s", strerror(errno));
		//如果calloc失败就把失败原因显示出来
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ",*(p+i));//开辟后所有内容初始化为0
	}
	free(p);
	p = NULL;
	return 0;
}
4.realloc

realloc是在malloc和calloc开辟空间后不足情况下继续开辟一块空间

开辟空间有3种情况:

1.如果p指向的空间之后没有足够的内存可以追加,则直接追加,后返回p

2.当p指向的空间不满足追加,则realloc函数会重新找一个新的内存区域

开辟一块满足需求的空间,并且把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址

3.开辟新的空间失败,返回NULL,会把原来的空间地址也搞丢(得用新的指针来接受realloc函数的返回值)


eg:假如在使用malloc开辟的20个字节空间

假设20个字节空间不够使用

再开辟40个字节的空间

这里就可以使用realloc来调整动态开辟的内存

#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
int main()
{
	int* p = (int*)malloc(5 * sizeof(int));
	if (p == NULL)
	{
		printf("%s",strerror(errno));
	}
	else
	{
		for (int i = 0; i < 5; i++)
		{
			*(p + i) = i;
		}
		for (int i = 0; i < 5; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	int *ptr = realloc(p, sizeof(int));
	if (ptr != NULL)
	{
		int i = 0;
		p = ptr;//既可避免开辟失败把原先的也释放掉,又可以用指针p继续指向新开辟的空间
		for ( i = 5; i < 10; i++)
		{
			*(p + i) = i;
		}
		for ( i = 5; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	free(p);
	p = NULL;
	return 0;
}
5.利用realloc可以代替malloc
int main()
{
	int* p = realloc(NULL, 40);//==malloc(40)
	return 0;
}


标签:malloc,NULL,--,堆区,int,空间,include,开辟
From: https://blog.51cto.com/u_16425777/9135033

相关文章

  • 常见的动态内存开辟错误
    1.没有判断malloc返回值是否开辟成功,对NULL解引用操作intmain(){ int*p=(int*)malloc(40);//没有判断malloc开辟失败情况 //万一malloc失败,p就被赋值为NULL for(inti=0;i<10;i++) { *(p+i)=i; } free(p); p=NULL; return0;}2.对动态开辟内存的越界......
  • 返回栈空间地址的问题
    #include<stdlib.h>#include<stdio.h>char*GetMemory(void){ charp[]="helloworld";//当把p返回给str后数组就生命周期结束,指向该地址的内容就随机了 returnp;}voidTest(void){ char*str=NULL; str=GetMemory(); printf(str);}intmain(){ Test();//会越......
  • Invalid bound statement (not found)的原因以及解决方法
    在学习mybatis中,我们总会遇到这个问题,以下有几种解决方式第一种:查看自己的mapper接口文件与自己的mapper.xml文件是否一致一致在看namespace中的路径是否正确,namespace要写的是接口的全路径可以使用mybatisX插件来看第二种:查看编译的target文件中是否有mapper,也就是有没有编......
  • 【教3妹学编程-算法题】赎金信
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开森。3妹:2哥你看今天的天气多好啊,最近一周都是大晴天,艳阳高照2哥:是啊,天气不冷不热的,很适合生活3妹:据说南方的小土豆都跑到北方滑雪了,哈哈哈哈2哥:泼水成冰好玩是好玩,但是一定要注意防寒哦,看新闻都......
  • python学习笔记7(不同进制之间的转换、算术运算符、赋值运算符、比较运算符、逻缉运算
    一)不同进制之间的转换二进制:0B或0b开头八进制:0o或0O开头十六进制:0x或0X开头(二)算术运算符//整除幂运算print(23)算术运算符优先级1、**2、*,/,%,//3、+,-(三)赋值运算符+=、-=、*=、/=、%=、**=、//=python支持链式赋值a=b=c=100python支持系列解包赋值a,b=10,20python中的值交换b,a=......
  • python 使用多个界定符分割字符串
    问题你需要将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的。解决方案string对象的split()方法只适应于非常简单的字符串分割情形,它并不允许有多个分隔符或者是分隔符周围不确定的空格。当你需要更加灵活的切割字符串的时候,最好使用re.split()方法......
  • javascript基础学习系列一:标识符
    一般来说,语言中的标识符可以分为两类,一类用于命名语法(以及类型),一类用于命名值(的存储位置)。前者被称为“语法关键字”,后者则被称为“变量”和“常量”。由此引入了一个概念:绑定。从标识符的角度来说,绑定分为语法关键字与语法(语义)逻辑的绑定,以及变量与它所存储值的位置的绑定......
  • [EFI]Thinkpad L380 Yoga电脑 Hackintosh 黑苹果efi引导文件
    硬件型号驱动情况主板ThinkpadL380Yoga处理器1.7GHzIntelCorei5-8250UQuad-Core已驱动内存16GBDDR42400mhz已驱动硬盘m.2nvme256gbKingstonNV2已驱动显卡IntegratedIntelUHDGraphics620已驱动声卡暂无详细信息已驱动网卡以太网控制器i225-LM已驱动无线网卡+蓝牙......
  • 美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推
    一、介绍美食管理与推荐系统。本系统使用Python作为主要开发语言开发的一个美食管理推荐网站平台。网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求,并将用户的相关行为数据保存在数据库中。通过Ajax技术实现前后端的数据通信。创新点......
  • C 语言函数完全指南:创建、调用、参数传递、返回值解析
    C语言中的函数函数是一段代码块,只有在被调用时才会运行。您可以将数据(称为参数)传递给函数。函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。预定义函数事实证明,您已经知道什么是函数了例如,main()是一个函数,用于执行代码,printf()也是一个函数,用于向屏......