动态内存数组(malloc、calloc、realloc、free)

news2024/11/18 16:48:31

一、为什么要创建动态内存数组

动态内存,顾名思义就是说在内存中非固定的申请数组

在学习该项方法前我们申请内存的方法无非就两种:直接创建变量/通过创建数组的方式来申请空间。

那么直接创建变量/通过创建数组的方式来申请空间的缺点就是一旦创建成功,则空间不能改变。

而动态则不同,它让程序员⾃⼰可以申请和释放空间,就⽐较灵活了。

二、malloc和free

首先来说一下malloc函数,使用方法:void* malloc (size_t size);

参数是你要创建的空间数,单位为字节。

我们来看以下代码:

int main()
{
	int* p = (int*)malloc(sizeof(int) * 5);
	return 0;
}

此时我们创建的malloc函数存在两种可能,首先第一种是创建成功了,第二种就是创建失败了。

我们先来看创建成功后应该怎么做:

#include<stdlib.h>

int main()
{
	int* p = (int*)malloc(sizeof(int) * 5);
	for (int i = 0; i < 5; i++)
	{
		*(p+i) = i;
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", p[i]);
	}
	free(p);
	return 0;
}

以上就是创建成功我们可以做的事,而当malloc函数创建失败时,它会返回NULL,而NULL指针的使用会导致野指针

所以我们要在后面添加一个判断:

int main()
{
	int* p = (int*)malloc(sizeof(int) * 5);
	if (p == NULL)
		return 1;
	for (int i = 0; i < 5; i++)
	{
		*(p + i) = i;
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", p[i]);
	}
	free(p);
	return 0;
}

这样就OK了,这就是malloc函数的完整用法

三、calloc的创建和使用

calloc的作用和malloc的作用相同,都是用来创建动态数组的。

他们之间的不同之处在于calloc在创建完成后会自动将数组内容初始化为0。

我们来看以下代码:

int main()
{
	int* p = (int*)calloc(10 ,sizeof(int));
	if (NULL != p)
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	free(p);
	p = NULL;
	return 0;
}

可以看到,在使用完calloc函数后,所有元素都被初始化为0了。

所以如果我们对申请的内存空间的内容要求初始化,那么使用calloc函数将会非常方便。

四、realloc函数的创建和使用

realloc函数使得malloc和calloc函数(动态内存管理)更加灵活。

realloc(void*ptr,size_t size);

两个参数:ptr指向要修改的数组地址,size则是修改后的大小,单位为字节。

它的作用就是调整已经创建的动态数组大小,我们来看以下代码:

int main()
{
	int* p = (int*)calloc(10, sizeof(int));
	if (NULL != p)
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	int * ptr = realloc(p, 80);
	if (ptr != NULL)
	{
		p = ptr;
	}
	free(p);
	p = NULL;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1537609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于python+vue拍卖行系统的设计与实现flask-django-nodejs-php

拍卖行系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;拍卖行…

2024学习鸿蒙开发,未来发展如何?

一、前言 想要了解一个领域的未来发展如何&#xff0c;可以从如下几点进行&#xff0c;避免盲从&#xff1a; 国家政策落地情况就业市场如何学习 通过上述三点&#xff0c;就能分析出一个行业的趋势。大家可以看到&#xff0c;我上面的总体逻辑就是根据国家政策来分析未来方…

大数据技术在工厂生产数字转型中的应用与价值

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着大数据技术的快速发展&#xff0c;越来越多的企业开始关注并应用大数据技术&#x…

第6讲-MIPS处理器(3)MIPS单周期处理器设计

三. MIPS单周期处理器设计 1.单周期数据通路设计

联合国通过首个全球人工智能决议草案

当地时间3月21日&#xff0c;联合国大会一致通过了全球第一个关于人工智能&#xff08;AI&#xff09;的决议草案&#xff0c;以期能够保护个人数据、保障人权&#xff0c;并能有效监控其安全风险。 该决议由美国提出&#xff0c;包括中国在内的其他121个国家共同参与了制定&am…

移动硬盘故障解析:解决无法访问且位置不可用问题

在我们日常的工作和生活中&#xff0c;移动硬盘已成为存储和传输数据的重要工具。然而&#xff0c;有时我们会遇到移动硬盘无法访问且位置不可用的情况&#xff0c;这无疑给数据的存储和访问带来了极大的困扰。本文将深入探讨这一问题&#xff0c;分析其原因&#xff0c;并给出…

提升交付效率:Booking.com 金融技术团队的成功实践

Booking.com 金融技术业务部门的团队对其平台的后端和前端实施了一系列改进措施&#xff0c;并通过 DORA 指标将交付性能提高了一倍。此外&#xff0c;还使用了微前端 (MFE) 模式&#xff0c;将单体 FE 应用程序分解为多个可单独部署的分解应用程序。 2022 年年中&#xff0c;B…

HTML5+CSS3+JS小实例:创意罗盘时钟

实例:创意罗盘时钟 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

代码随想录算法训练营第day54|392.判断子序列 、 115.不同的子序列

目录 392.判断子序列 115.不同的子序列 392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字…

《妈妈是什么》笔记(三) 引导孩子做内部自我评价

经典摘录 教孩子如何拒绝 假如你不得不帮助人&#xff0c;请尽力。尽力也包括&#xff0c;用好的态度让不得不求助的人安心&#xff0c;这比帮助还重要。如果你实在不能帮助&#xff0c;也请用好的态度、客观的事实来婉拒&#xff0c;拒绝已经太沉重&#xff0c;如何拒绝&…

详解如何使用Pytest进行自动化测试

为什么需要自动化测试 自动化测试有很多优点&#xff0c;但这里有3个主要的点 可重用性:不需要总是编写新的脚本&#xff0c;除非必要&#xff0c;即使是新的操作系统版本也不需要编写脚本。可靠性:人容易出错&#xff0c;机器不太可能。当运行不能跳过的重复步骤/测试时&…

用redis lua脚本实现时间窗分布式限流

需求背景&#xff1a; 限制某sql在30秒内最多只能执行3次 需求分析 微服务分布式部署&#xff0c;既然是分布式限流&#xff0c;首先自然就想到了结合redis的zset数据结构来实现。 分析对zset的操作&#xff0c;有几个步骤&#xff0c;首先&#xff0c;判断zset中符合rangeS…

Springboot开发中可能遇到的问题

SpringBoot特征&#xff1a; 1. SpringBoot Starter&#xff1a;他将常用的依赖分组进行了整合&#xff0c;将其合并到一个依赖中&#xff0c;这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单&#xff0c;SpringBoot采用 JavaConfig的方式对Spring进行配置…

保持原先的滚动位置

场景&#xff1a; 一个商品页面&#xff0c;一直滑 划到中间 然后点进去详情页面了 然后再返回 怎么让他保持在中间的位置 方案1&#xff1a;传商品id 做锚点定位 vue中实现锚点定位以及平滑滚动到指定位置_vue中锚点跳转和页面滚动锚点定位-CSDN博客 goAnchor(id) {var anch…

构建强大的API:Django中的REST框架探究与实践【第146篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 构建强大的API&#xff1a;Django中的REST框架探究与实践 在当今的Web开发中&#xff0c;构…

1. Java基础入门

1. Java基础入门 1.1 Java介绍(了解) 1.1.1 Java背景 Java是美国 sun 公司&#xff08;Stanford University Network&#xff09;在1995年推出的一门计算机高级编程语言。Java 之父&#xff1a;詹姆斯高斯林(James Gosling)。 2009年 sun公司被Oracle公司收购。Java公司图标…

#Linux(权限管理)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;-开头代表普通文件 划分为三组&#xff1a; rw- rw- r-- rw-: 文件拥有…

模拟B\S服务器(扩展知识点)

3.2 模拟B\S服务器(扩展知识点) 模拟网站服务器&#xff0c;使用浏览器访问自己编写的服务端程序&#xff0c;查看网页效果。 案例分析 准备页面数据&#xff0c;web文件夹。 复制到我们Module中&#xff0c;比如复制到day08中 我们模拟服务器端&#xff0c;ServerSocket类…

Linux课程____Samba文件共享服务

一、 Samba服务基础 SMB协议&#xff0c;服务消息块 CIFS协议&#xff0c;通用互联网文件系统 1.Samba 服务器的主要程序 smbd:提供对服务器中文件、打印资源的共享访问 nmbd:提供基于 NetBlOS 主机名称的解析 2.目录文件 /etc/samba/smb.conf 检查工具&#xff1a;test…

Java22重磅发布!!!!卷不动了,真的卷不动了。。。。

就在3月19日&#xff0c;Java22重磅发布。Java22新增了12项增强功能&#xff0c;其中包括七个预览特性和一个孵化器特性&#xff0c;这些功能都显著到足以引起JDK增强提案&#xff08;JEPs&#xff09;的关注。它们涵盖了Java语言、其API、性能以及JDK中包含的工具的改进。 真…