C语言——动态内存函数(malloc、calloc、realloc、free)

news2024/11/24 9:15:26

了解动态内存函数

  • 前言:
  • 一、malloc函数
  • 二、calloc函数
  • 三、realloc函数
  • 四、free函数

前言:

在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了,开辟的空间满了,就不能在开辟空间了(就是不能在添加数据了)。学习本文章,我们就可以解决这个问题,向内存申请空间,满啦可以继续申请空间。

一、malloc函数

需要头文件——<stdlib.h>
在这里插入图片描述
浏览器直接翻译:
在这里插入图片描述
malloc函数(动态内存开辟的函数):

void* malloc(size_t size);

功能:
这个函数向内存申请一个连续可用的空间,并返回指向这块空间的指针。

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定。
  • 如果size为0,malloc的行为是标准还是未定义的,由编译器决定。
  • malloc申请的空间,当程序退出时,要还给操作系统,当程序不退出,动态申请的内存,不会主动释放,需要用free函数来释放。
    malloc申请的内存空间:
    malloc申请到空间后,直接返回这个空间的首地址,不会初始化空间的内容。
    举个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//变长数组的知识点(vs不能用,gcc可以用)
    //int num = 0;
    //scanf("%d", &num);
    //int arr[num] = { 0 };
    int* ptr = NULL;
    ptr = (int*)malloc(40);
    if (ptr == NULL)//判断ptr指针是否为空
    {
        perror("malloc");
        exit; 
    }
    else
    {
        int i = 0;
        for (i = 0; i < 10; i++)//给开辟的空间赋值
            ptr[i] = i + 1;
    }
    free(ptr);//释放ptr指向的空间
    ptr = NULL;//让ptr指向空
    return 0;
}

二、calloc函数

需要头文件——<stdlib.h>
在这里插入图片描述
浏览器直接翻译:
在这里插入图片描述
calloc函数(动态内存分配函数):

void* calloc(size_t num, size_t size);

功能:

  • 函数的功能是,为num个大小为size元素开辟一块空间,并且把空间的每一个字节初始化为0.
  • 与malloc函数的区别,只在于calloc函数会在返回地址之前把申请空间的每一个字节初始化为0.
    举个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int* p = (int*)calloc( 10,sizeof(int));
    if (p == NULL)//成立,开辟失败
    {
        perror("calloc");
        exit;
    }
    free(p);
    p = NULL;
    return 0;
}

p指向的地址:
在这里插入图片描述

三、realloc函数

需要头文件——<stdlib.h>
在这里插入图片描述
浏览器直接翻译:
在这里插入图片描述
realloc函数(动态内存管理更加灵活):
有时候我们发现过去申请的空间小了,有时候我们会觉得过去申请的空间过大,为了合理使用内存,我们一定要对内存的大小做灵活的调整。realloc函数可以做到对动态开辟内存大小进行调整。

void* realloc(void* ptr, size_t size);

功能:

  • ptr是要调整的内存地址。
  • size是调整后的新大小。
  • 返回值为调整之后的内存起始位置。
  • 这个函数在调整原空间大小的基础上,还会将原来的数据移到新的空间。
    注意:
    realloc调整内存空间有两种情况。
    • 情况1:原有空间之后有足够大的空间(原地扩容)。
      当是情况1的时候,要扩展内存就直接在原有内存之后直接追加空间,原来空间的数据不发生改变。
      在这里插入图片描述

    • 情况2:原有空间后面没有足够大的空间(异地扩容)。
      当是情况2的时候,原有空间后面没有足够多的空间时,扩展的方法是:在堆空间上另外找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。
      在这里插入图片描述
      所以我们在使用realloc函数的时候一定要注意:
      1、开辟新的空间。
      2、 会将旧的空间数据拷贝到新的空间。
      3、释放旧的空间。
      4、返回新空间的起始地址。
      举个例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int* ptr =(int*) malloc( 100 );
    if (ptr != NULL)
    {
//可以使用这个空间
    }
    else
    {
        perror("malloc");
        exit;
    }
    //扩展空间
    int* p = (int*)realloc(ptr, 1000);//可能增容失败
    if (p != NULL)
    {
        //增容成功
        ptr = p;//p指向的空间交给ptr去维护
    }
    free(ptr);//把开辟早堆上的空间释放掉
    ptr = NULL;
    return 0;
}

四、free函数

需要头文件——<stdlib.h>
在这里插入图片描述
浏览器直接翻译:
在这里插入图片描述
free函数(释放动态开辟的内存):

void* free(void* ptr);

功能:

  • 如果参数ptr指向的那个空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数ptr是NULL指针,则函数什么事都不做。

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

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

相关文章

机器学习:基本介绍

机器学习介绍 Hnad-crafted rules Hand-crafted rules&#xff0c;叫做人设定的规则。那假设今天要设计一个机器人&#xff0c;可以帮忙打开或关掉音乐&#xff0c;那做法可能是这样&#xff1a; 设立一条规则&#xff0c;就是写一段程序。如果输入的句子里面看到**“turn of…

maven工具-maven的使用-镜像仓库、本地仓、IDEA使用maven

Maven 一、为什么使用maven 添加第三方jar包jar包之间的依赖关系处理jar包之间的冲突获取第三方jar包将项目拆分成多个工程模块实现项目的分布式部署 二、maven简介 ​ Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的…

B树和B+树区别

B树和B树的区别 B树 B树被称为平衡树&#xff0c;在B树中&#xff0c;一个节点可以有两个以上的子节点。B树的高度为log M N。在B树中&#xff0c;数据按照特定的顺序排序&#xff0c;最小值在左侧&#xff0c;最大值在右侧。 B树是一种平衡的多分树&#xff0c;通常我们说m阶…

Base64编码-算法特别的理解

Base64 在DES加密和AES加密的过程中&#xff0c;加密的编码会出现负数&#xff0c;在ascii码表中找不到对应的字符&#xff0c;就会出现乱码。为了解决乱码的问题&#xff0c;一般结合base64使用 所谓Base64&#xff0c;即是说在编码过程中使用了64种字符&#xff1a;大写A到Z、…

【多线程】网络原理初识

网络原理初识 1. 网络发展史1.2 独立模式1.3 网络互联1.3 局域网1.4 广域网 2. 网络通信基础2.1 IP地址2.2 端口号2.3 认识协议2.4 五元组2.5 协议分层2.5.1 什么是协议分层2.5.2 协议分层的好处2.5.2 OSI七层模型2.5.3 TCP/IP五层模型 2.6 封装和分用2.6.1 封装2.6.1.1 应用层…

MyBatis-Plugin源码全面分析

三、MyBatis-Plugin 1. 基本开发方式 需求&#xff1a;在MyBatis执行之前打印一行醒目的日志&#xff0c;携带参数 实现Interceptor接口&#xff1a; Intercepts(Signature(type Executor.class,method "query",args {MappedStatement.class,Object.class, RowB…

在 Linux 中使用 cp 命令

cp 命令是 Linux 中一个重要的命令&#xff0c;你可能经常会用到它。 正如名称所示&#xff0c;cp 代表 复制copy&#xff0c;它被用于 在 Linux 命令行中复制文件和目录。 这是一个相对简单的命令&#xff0c;只有几个选项&#xff0c;但你仍有必要深入了解它。 在展示 cp …

UML图绘制 -- 类图

1.类图的画法 类 整体是个矩形&#xff0c;第一层类名&#xff0c;第二层属性&#xff0c;第三层方法。 &#xff1a;public- : private# : protected空格: 默认的default 对应的类写法。 public class Student {public String name;public Integer age;protected I…

ardupilot参数的mavlink实现

专业名词释义&#xff0c;参数缩写 gimbal 云台&#xff0c;万向接头 failsafe 故障保护 Collective&#xff1a; 总距 Swashplate &#xff1a; 倾斜盘 SW&#xff1a; Swashplate 倾斜盘 RSC&#xff1a; Rotor Speed Control RC&#xff1a; Radio Channel 无线通道 DDFP&am…

16 dlsys GAN

和有监督的分类工作不同&#xff0c;生成任务的目标更不明确。难以评价生成结果的好坏。 Oracle discriminator 假设我们有一个先知判别器oracle discriminator可以分辨我们生成的内容是真还是假。 D(x) 表示判别数据为真的概率。 我们想让生产成的结果足够真实&#xff0c;所…

前端基础(二)

前言&#xff1a;前端开发框架——Vue框架学习。 准备工作&#xff1a;添加Vue devtools扩展工具 具体可查看下面的这篇博客 添加vue devtools扩展工具添加后F12不显示Vue图标_MRJJ_9的博客-CSDN博客 Vue官方学习文档 Vue.js - 渐进式 JavaScript 框架 | Vue.js MVVM M…

大数据-玩转数据-Flink网页埋点PV统计

一、说明 衡量网站流量一个最简单的指标&#xff0c;就是网站的页面浏览量&#xff08;Page View&#xff0c;PV&#xff09;。用户每次打开一个页面便记录1次PV&#xff0c;多次打开同一页面则浏览量累计。 一般来说&#xff0c;PV与来访者的数量成正比&#xff0c;但是PV并不…

深入理解Linux内核--I/0体系结构和设备驱动程序

I/0体系结构和设备驱动程序 I/O体系结构 为了确保计算机能够正常工作&#xff0c;必须提供数据通路&#xff0c;让信息在连接到个人计算机的CPU、RAM和I/O设备之间流动。 这些数据通路总称为总线&#xff0c;担当计算机内部主通信通道的作用。所有计算机都拥有一条系统总线&a…

Hugging News #0814: Llama 2 学习资源大汇总

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现…

java练习3.分块查找

题目: 数组 arr{12,43,11,23,54,123,56,12,34} 利用分块排序, 进行从小到大的排序 public class recursionDemo {public static void main(String[] args) {int[] arr{12,43,11,23,54,123,56,12,34};//1.找到无序组 是从哪个元素开始的int startIndex0;for (int i 0; i < …

别人直播的时候怎么录屏?分享一些录屏方法

​随着互联网的快速发展&#xff0c;直播已经成为人们日常生活中不可或缺的一部分。但是&#xff0c;有时候我们可能会错过某些重要的直播内容&#xff0c;这时候就需要录屏来保存和观看。那么&#xff0c;如何录屏别人的直播呢&#xff1f;本文将分享一些录屏方法和技巧&#…

【计算机设计大赛】国赛一等奖项目分享——基于多端融合的化工安全生产监管可视化系统

文章目录 一、计算机设计大赛国赛一等奖二、项目背景三、项目简介四、系统架构五、系统功能结构六、项目特色&#xff08;1&#xff09;多端融合&#xff08;2&#xff09;数据可视化&#xff08;3&#xff09;计算机视觉&#xff08;目标检测&#xff09; 七、系统界面设计&am…

QGIS3.28的二次开发五:VS使用QT插件创建UI界面

前面我们说了在创建项目时创建的是一个空项目&#xff0c;即不使用 Qt 提供的综合开发套件 Qt Creator&#xff0c;也不使用 Qt Visual Studio Tools 这类工具。 但是后面发现&#xff0c;如果我想要有更加满意的界面布局&#xff0c;还是要自己写一个UI文件&#xff0c;如果不…

无涯教程-Perl - s函数

描述 这不是功能。这是正则表达式替换运算符。根据PATTERN中指定的正则表达式,将数据替换为REPLACE。与m //一样,分隔符由s后的第一个字符定义。 语法 以下是此函数的简单语法- s/PATTERN/REPLACE/返回值 如果失败,此函数返回0,如果成功,则返回替换次数。 例 以下是显示…