calloc、malloc、realloc函数的区别及用法

news2024/11/23 10:45:04

三者都是分配内存,都是stdlib.h库里的函数,但是也存在一些差异。

(1)malloc函数。其原型void *malloc(unsigned int num_bytes);
num_byte为要申请的空间大小,需要我们手动的去计算,如int *p = (int )malloc(20sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请一个80Byte的连续空间,并将空间基地址强制转换为int类型,赋值给指针p,此时申请的内存值是不确定的。

(2)calloc函数,其原型void *calloc(size_t n, size_t size);
其比malloc函数多一个参数,并不需要人为的计算空间的大小,比如如果他要申请20个int类型空间,会int *p = (int *)calloc(20, sizeof(int)),这样就省去了人为空间计算的麻烦。但这并不是他们之间最重要的区别,malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0;

实例:

    int *p = (int *)malloc(20*sizeof(int));
    int *pp = (int *)calloc(20, sizeof(int));
    int i;
    
    printf("malloc申请的空间值:\n\n");
    for ( i=0 ; i < 20; i++)
    {
        printf("%d ", *p++);
    }
    printf("\n\n");
    printf("calloc申请的空间的值:\n\n");
    for ( i=0 ; i < 20; i++)
    {
        printf("%d ", *pp++);
    }
    printf("\n");

结果:
在这里插入图片描述
(3)realloc函数和上面两个有本质的区别,其原型void realloc(void *ptr, size_t new_Size)
用于对动态内存进行扩容(及已申请的动态空间不够使用,需要进行空间扩容操作),ptr为指向原来空间基址的指针, new_size为接下来需要扩充容量的大小。
实例:

int main(void)
{
    const int size = 2000;
    int *p = (int *)malloc(20*sizeof(int));
    int *pp = (int *)realloc(p, size*sizeof(int));
    
    printf("原来的p_Address:%x   扩容后的pp_Address:%x \n\n", p, pp);
    
    return 0;
}

结果:
在这里插入图片描述
可从图看出,扩容后地址和原先地址是不一样的,但是这仅仅取决于扩容的内存大小。

实际上:

如果size较小,原来申请的动态内存后面还有空余内存,系统将直接在原内存空间后面扩容,并返回原动态空间基地址;如果size较大,原来申请的空间后面没有足够大的空间扩容,系统将重新申请一块(20+size)*sizeof(int)的内存,并把原来空间的内容拷贝过去,原来空间free;如果size非常大,系统内存申请失败,返回NULL,原来的内存不会释放。注意:如果扩容后的内存空间较原空间小,将会出现数据丢失,如果直接realloc(p, 0);相当于free§.

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

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

相关文章

VBA还能这么玩?Word文档一秒自动排版

Hello,各位小伙伴们大家好呀,真的是好久不见了。旅行者1号也才用20个小时回传数据到地球。距离 Yogurt 上次正儿八经的教程推文已经快 700 天了,时间过得真快呀,感谢各位的不离不弃。 这两天群里比较活跃,便上去看看发生了啥事儿,不看不知道,一看,这推文的素材不就来…

「实验记录」CS144 Lab0 networking warmup

文章目录 一、Motivation二、SolutionsS1 - Writing webgetS2 - An in-memory reliable byte stream 三、Results四、Source 一、Motivation 第一个小测试 webget 是想让我们体验并模拟一下在浏览器中键入 URL 后获得远程服务器传来的内容&#xff0c;这并没有太大的难度&…

Spring cloud教程Gateway服务网关

Spring cloud教程|Gateway服务网关 写在前面的话&#xff1a; 本笔记在参考网上视频以及博客的基础上&#xff0c;只做个人学习笔记&#xff0c;如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01; Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;…

数字频带传输——二进制数字调制及MATLAB仿真

文章目录 前言一、OOK1、表达式2、功率谱密度3、调制框图 二、2PSK1、表达式2、功率谱密度 三、2FSK1、表达式 四、MATLAB 仿真1、MATLAB 源码2、仿真及结果①、输入信号及频谱图②、2ASK 调制③、2PSK 调制④、2FSK 调制⑤、随机相位 2FSK 调制 五、资源自取 前言 数字频带信…

LightGBM 的完整解释 - 最快的梯度提升模型

文章最前&#xff1a; 我是Octopus&#xff0c;这个名字来源于我的中文名--章鱼&#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github &#xff1b;这博客是记录我学习的点点滴滴&#xff0c;如果您对 Python、Java、AI、算法有兴趣&#xff0c;可以关注我的…

磁盘管理(初始化,引导块,坏块管理,固态硬盘)

目录 1.磁盘初始化2.引导块3.坏块的管理1.坏块检查2.坏块链表3.扇区备用 4.固态硬盘&#xff08;SSD&#xff09;1.原理2.组成3.读写性能特性4.与机械硬盘相比5.磨损均衡技术 1.磁盘初始化 ①进行低级格式化&#xff08;物理格式化&#xff09;&#xff0c;将磁盘的各个磁道划分…

Git基础 | 原理、配置、用法、分支 合并

目录 1 git初步了解 1.1 git的安装 1.2 git原理模型 1.3 git基础配置 1.4 git基础用法 1 将文件加入暂存区 2 查看当前的git仓库状态 3 删除文件 4 commit 将暂存区文件加入本地git版本仓库 5 查看提交历史 更改 2 分支 2.1 创建分支 2.2 查看分支 2.3 切换分支 …

vue+uniapp快餐店微信扫码点餐订餐系统 微信小程序

点餐是商家的核心&#xff0c;是必不可少的一个部分。在餐饮的整个服务行业中&#xff0c;顾客担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类微信小程序也在不断改进。本课题所设计的快餐店微信扫码点餐小程序&#xff0c;使用微信开发者与java语言进行开…

省市区三级联动查询redis(通过python脚本导入数据)

最近工作有一个工作需求是实现省市区联动&#xff0c;点击省下拉框&#xff0c;选中一个省&#xff0c;然后再选市&#xff0c;最后选区&#xff0c;当然最重要的首先自然是数据了&#xff0c;没数据怎么测试接口&#xff0c;我数据是在 https://hxkj.vip/demo/echartsMap/ 这里…

大数据前置学习基础准备(非常详细!)

1.需要的环境 需要3台服务器&#xff0c;centos7 为集群&#xff0c;全部设置为nat模式 2.整个环境大体 1.设置三台Linux虚拟机的主机和固定ip 2.在Linux系统以及本机系统中配置了主机名映射 3.配置了三台服务器之间root用户的ssh免密互通 4.安装配置JDK环境 5.关闭防火墙和SEL…

宝塔安装mongodb插件失败的解决办法

安装时始终不成功。 进入控制台进行安装 /www/server/php/71# pecl install mongodb WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update pecl/mongodb requires PHP (version > 7.2.0, …

2317.操作后的最大异或和

非常好的一个位运算推公式题目 首先num[i]^x可以知道 这里可以变成任意一个数字 又有num[i]&上上面的数字 所以我们可以扣掉任意位的1把它变成0 答案让我们求异或和 所以只要这一位有1 答案的这一位就有1 我们发现这就是一个按位或运算 class Solution { public:int maxi…

C#__简单了解XML文档

/* XML(可扩展标记语言)&#xff1a;用于传输和存储数据 XML文档&#xff1a;树结构&#xff1b;包含根元素 XML元素&#xff1a;从开始标签到结束标签的部分 XML语法规则&#xff1a; 1、所有XML元素都必须有结束标签 …

GAMP源码阅读(中)伪距单点定位 SPP

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、SPP 解算1、spp()&#xff1a;单点定位主入口函数2、estpos()3、estpose_()4、valsol()&#xff1a;GDOP和卡方检验结果有效性 二、卫星位置钟…

BraTS2021脑肿瘤分割实战

Brain Tumor Segmentation (BraTS) Challenge 2021 Homepage github项目地址 brats-unet: UNet for brain tumor segmentation BraTS是MICCAI所有比赛中历史最悠久的&#xff0c;到2021年已经连续举办了10年&#xff0c;参赛人数众多&#xff0c;是学习医学图像分割最前沿的…

【ChatGPT 01】ChatGPT基础科普

1. 从图灵测试到ChatGPT 1950年&#xff0c;艾伦•图灵(Alan Turing)发表论文**《计算机器与智能》&#xff08; Computing Machinery and Intelligence&#xff09;&#xff0c;提出并尝试回答“机器能否思考”这一关键问题。在论文中&#xff0c;图灵提出了“模仿游戏”&…

2.2 消元法的概念

一、消元法介绍 消元法&#xff08;elimination&#xff09;是一个求解线性方程组的系统性方法。下面是使用消元法求解一个 2 2 2\times2 22 线性方程组的例子。消元之前&#xff0c;两个方程都有 x x x 和 y y y&#xff0c;消元后&#xff0c;第一个未知数 x x x 将从第…

Websocket传递JWT令牌

在访问带有[Authorize]的方法的时候&#xff0c;需要前端通过自定义报文头的形式将JWT令牌传递给后端进行验证&#xff0c;否则是不能访问带有[Authorize]的方法。 [Authorize]是用于限制对web应用程序中某些操作或控制器的访问。当[授权]属性应用于操作或控制器时&#xff0c;…

【Linux】多路IO复用技术①——select详解如何使用select在本地主机实现简易的一对多服务器(附图解与代码实现)

这一篇的篇幅可能有点长&#xff0c;但真心希望大家能够静下心来看完&#xff0c;相信一定会有不小的收获。那么话不多说&#xff0c;我们这就开始啦&#xff01;&#xff01;&#xff01; 目录 一对一服务器中的BUG 如何实现简易的一对多服务器 实现简易一对多服务器的大体…

Python超入门(7)__迅速上手操作掌握Python

# 31.类 class Point:# 构造函数def __init__(self, x, y, z):self.x xself.y yself.z z# 自定义函数def move(self):print("move")def draw(self):print("draw")# 定义一个Point类的实例point1 # 注意&#xff1a;新建实例的参数要与构造函数一致 poi…