C语言:动态内存管理(上)

news/2024/4/29 16:42:33

目录

前言

1、动态内存函数的介绍

1.1 malloc和free

1.2 calloc函数​编辑

结语


前言

        在我们之前对于c语言的学习中,我们知道,当我们要存放数据时,可以定义相应的变量取存放,但是在变量定义后,其大小是无法改变的,如果定义了一个int类型的变量c,那么对于c来说,他就会一直保持4字节的大小,不能存放8字节的数据。

        那么我们今天学习的内容就是实现对内存的动态管理,内存会跟着内容发生改变,实现对内存的最大效率使用,这就是你动态内存管理。 

        对于动态内存管理的学习,我们主要掌握4个函数的用法:malloc;calloc;realloc;free。

1、动态内存函数的介绍

1.1 malloc和free

        malloc介绍:

        malloc是开辟内存块函数,传递的参数是要开辟的空间大小,返回的是指向所开辟空间的起始地址。

        注意,在使用malloc时,是有可能申请失败的,如果申请的空间太大,计算机无法满足时,就会失败。

        malloc函数使用,举个例子:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>int main()
{//动态内存开辟int* p = (int*)malloc(40);if (p == NULL)	//判断是否开辟成功,开辟失败就报错。{printf("%s\n", strerror(errno));return 1;}//使用int i = 0;for (i = 0;i < 10;i++){*(p + i) = i;}for (i = 0;i < 10;i++){printf("%d ", *(p + i));}//空间释放free(p);p = NULL;return 0;
}

效果:        

        我们分三部分讲解

        第一部分:内存开辟

        

        这一部分,用malloc申请空间,使用malloc时要包含头文件stdlib.h。申请好空间后,需要对其进行判断,判断是否开辟成功,如果失败,则p为空指针,后面的程序就不能运行,需要我们检测出并报错,这里就用到了strerror这个报错函数,他会将错误码翻译成错误内容,翻译后我们用printf进行打印就好了。

        第二部分:内存使用

        这个使用就和正常的指针使用是一样的。

        第三部分:空间释放:

        用free函数对p的空间进行释放,然后使p指针变为空指针。

        注意,free函数只能针对malloc开辟的空间进行释放,所以如果我们对其他指针指向的内容用free释放时,会报错。

        malloc和free函数就先将到这,下面我们来讲另一个函数:calloc

1.2 calloc函数

        该函数参数有两个,第一个size_t num指要开辟元素的个数,size_t size是每个元素的大小。返回值为开辟空间的首地址指针。这个函数还有一个特点,就是在返回地址之前,会将开辟的空间初始化一遍(全0)。

        程序案例:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>int main()
{//开辟int* p = (int*)calloc(10, sizeof(int));if (p == NULL)	//判断是否开辟成功,开辟失败就报错。{printf("%s\n", strerror(errno));return 1;}//打印int i = 0;for (i = 0;i < 10;i++){printf("%d ", *(p + i));}//释放free(p);p = NULL;return 0;
}

        效果:        与malloc相似,分成三个部分,开辟,使用(打印)和释放。

        我们发现,用calloc开辟空间后直接打印出来,发现内容都是0。calloc和malloc区别其实就是初始化。如果想初始化就用calloc,如果不想,就用malloc。

        calloc函数就讲到这。

结语

        本篇先将这两个函数:malloc和calloc,下一篇再继续讲解。

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

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

相关文章

ChatGLM3:AttributeError_ can‘t set attribute ‘eos_token‘

最近在微调 ChatGLM3-6b 时&#xff0c;训练好模型之后&#xff0c;调用inference_hf.py函数验证模型的时候报了如下错误&#xff0c;下面是解决方案。 我在训练时使用的是ptuning_v2.yaml配置文件&#xff0c;训练运行代码如下&#xff1a; CUDA_VISIBLE_DEVICES1 python fi…

typescript 实现RabbitMQ死信队列和延迟队列 订单10分钟未付归还库存

Manjaro安装RabbitMQ 安装 sudo pacman -S rabbitmq rabbitmqadmin启动管理模块 sudo rabbitmq-plugins enable rabbitmq_managementsudo rabbitmq-server管理界面 http://127.0.0.1:15672/ 默认用户名和密码都是guest。 要使用 rabbitmqctl 命令添加用户并分配权限&#xf…

HTTP和HTTPS的区别

HTTP和HTTPS都是网络传输协议&#xff0c;主要用于浏览器和服务器之间的数据传输&#xff0c;但它们在数据传输的安全性、加密方式、端口等方面有所不同。数据传输的安全性&#xff1a;HTTP是明文传输&#xff0c;数据不加密&#xff0c;容易被黑客窃听、篡改或者伪造&#xff…

c语言编译和链接

一个.c源文件是如何经过处理变成可执行的.exe文件&#xff1f; 这其中经过了编译和链接两个大过程。总的来讲&#xff0c;就是每个源文件经过编译后生成对应地目标文件&#xff0c;然后所有的目标文件和所引用的标准库链接&#xff0c;形成了.exe文件。具体是怎样&#xff0c;…

CCLinkie转Modbus TCP网关在印染设备的应用

开疆的CCLinkie转Modbus TCP网关在印染设备的应用如下&#xff1a; 1. 设备连接&#xff1a;通过开疆CCLinkie转Modbus TCP网关&#xff0c;可以将印染设备连接到工业以太网 中&#xff0c;实现设备之间的数据通信和远程监控。 2. 数据采集&#xff1a;网关可以采集印染设备的…

图论之路径条数专题

一直忙着金工实习蓝桥杯&#xff0c;好久没有看图论了&#xff0c;今天就小试几题享受下被虐的快感。 1.最短路拓扑 首先来几个结论&#xff1a; 1.最短路图没有环&#xff08;可以用反证法证明&#xff09; 2.dis[u]edge[u,v]dis[v]&#xff0c;那么u,v端点的边一定在最短路…