深入理解C语言中的内存分配函数:malloc、calloc、realloc

目录:

  • 前言
  • 1. `malloc`:分配内存块
  • 2. `calloc`:分配并初始化内存块
  • 3. `realloc`:重新分配内存块
  • 总结

前言

在C语言编程中,动态内存分配是一个非常重要的概念。它允许我们在程序运行时根据需要分配和释放内存,从而提高程序的灵活性和效率。C语言提供了三个主要的内存分配函数:malloccallocrealloc。本文将详细介绍这三个函数的区别和使用场景。

1. malloc:分配内存块

malloc 是 “memory allocation” 的缩写,用于在堆区分配指定大小的内存块。分配的内存块中的内容是未初始化的,可能包含随机数据。

函数原型:

void* malloc(size_t size);
  • size:要分配的内存块的大小(以字节为单位)。
  • 返回值:成功时返回指向分配内存块的指针,失败时返回 NULL

示例:

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int n = 5;// 分配内存ptr = (int*)malloc(n * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存for (int i = 0; i < n; i++) {ptr[i] = i + 1;}// 打印数组for (int i = 0; i < n; i++) {printf("%d ", ptr[i]);}// 释放内存free(ptr);return 0;
}

注意事项:

  • malloc 分配的内存块中的内容是未初始化的,使用前需要手动初始化。
  • 分配的内存块大小可以是任意字节数,但通常是数据类型大小的倍数。

2. calloc:分配并初始化内存块

calloc 是 “clear allocation” 的缩写,用于在堆区分配指定数量的内存块,并将每个字节初始化为零。

函数原型:

void* calloc(size_t num, size_t size);
  • num:要分配的元素数量。
  • size:每个元素的大小(以字节为单位)。
  • 返回值:成功时返回指向分配内存块的指针,失败时返回 NULL

示例:

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int n = 5;// 分配并初始化内存ptr = (int*)calloc(n, sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存for (int i = 0; i < n; i++) {ptr[i] = i + 1;}// 打印数组for (int i = 0; i < n; i++) {printf("%d ", ptr[i]);}// 释放内存free(ptr);return 0;
}

注意事项:

  • calloc 分配的内存块中的内容会被初始化为零,适合用于需要初始化内存的场景。
  • calloc 的参数是元素数量和每个元素的大小,而不是总字节数。

3. realloc:重新分配内存块

realloc 是 “reallocate” 的缩写,用于调整已分配内存块的大小。它可以扩展或缩小内存块,并保留原有数据(如果新大小大于原大小)。

函数原型:

void* realloc(void* ptr, size_t size);
  • ptr:指向已分配内存块的指针。
  • size:新的内存块大小(以字节为单位)。
  • 返回值:成功时返回指向新分配内存块的指针,失败时返回 NULL

示例:

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int n = 5;// 分配内存ptr = (int*)malloc(n * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存for (int i = 0; i < n; i++) {ptr[i] = i + 1;}// 重新分配内存n = 10;ptr = (int*)realloc(ptr, n * sizeof(int));if (ptr == NULL) {printf("内存重新分配失败\n");return 1;}// 使用新分配的内存for (int i = 5; i < n; i++) {ptr[i] = i + 1;}// 打印数组for (int i = 0; i < n; i++) {printf("%d ", ptr[i]);}// 释放内存free(ptr);return 0;
}

注意事项:

  • realloc 可以扩展或缩小内存块,但可能会导致内存块的重新分配和数据的复制。
  • 如果 realloc 失败,返回 NULL,但原内存块不会被释放,需要手动处理。

总结

  • malloc:用于分配未初始化的内存块。
  • calloc:用于分配并初始化为零的内存块。
  • realloc:用于调整已分配内存块的大小,保留原有数据。

在实际编程中,根据具体需求选择合适的内存分配函数,可以提高程序的效率和可靠性。同时,注意在使用完动态分配的内存后,及时调用 free 函数释放内存,避免内存泄漏。

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

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

相关文章

CSS | 响应式布局之媒体查询(media-query)详解

media type(媒体类型)是CSS 2中的一个非常有用的属性&#xff0c;通过media type我们可以对不同的设备指定特定的样式&#xff0c;从而实现更丰富的界面。media query(媒体查询)是对media type的一种增强&#xff0c;是CSS 3的重要内容之一。随着移动互联网的发展&#xff0c;m…

微信小程序中的 `<block>` 元素:高效渲染与结构清晰的利器

微信小程序中的 <block> 元素&#xff1a;高效渲染与结构清晰的利器 在微信小程序的开发中&#xff0c;<block> 元素扮演着举足轻重的角色。尽管它不会在页面中渲染任何可见的节点&#xff0c;但作为一个逻辑上的容器&#xff0c;<block> 在条件渲染和循环渲…

reactNative本地调试localhost踩坑

本地调试请求localhost的时候 1.要和电脑处在同一局域网下面&#xff08;同一个wifi&#xff09; 2.把baseURL的localhost改成命令行中ipconfig查询到的IPv4 地址 . . . . . . . . . . . . : &#xff08;例如&#xff09;192.168.1.103 如果报错Net Work Error&#xff0c;可…

C语言普及难度三题

先热个身&#xff0c;一个长度为10的整型数组&#xff0c;输出元素的差的max和min。 #include<stdio.h> int main() {int m[10],i0,max,min;for(i0;i<10;i){scanf("%d",&m[i]);}minm[0];maxm[0];for (i 0; i <10; i){if(min>m[i]) min m[i];i…

BMC pam认证的使用

1.说明 1.1 文档参考资料 https://www.chiark.greenend.org.uk/doc/libpam-doc/html/Linux-PAM_ADG.htmlhttp://www.fifi.org/doc/libpam-doc/html/pam_appl-3.htmlpdf文档: https://fossies.org/linux/Linux-PAM-docs/doc/adg/Linux-PAM_ADG.pdflinux-pam 中文文档pam 旧文p…

Redis基础二(spring整合redis)

Springboot整合Redis 一、Springboot整合redis ​ redis可以通过使用java代码来实现 第一部分文档中 在终端操作redis的所有命令&#xff0c;Spring已经帮我们封装了所有的操作&#xff0c;所以变得很简单了。 ​ Spring专门提供了一个模块来进行这些操作的封装&#xff0c;这…

【Linux】详解Linux下的工具(内含yum指令和vim指令)

文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源&#xff08;针对于虚拟机用户&#xff09; 3. vim编辑器3.1 vim是什么&#xff1f;3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…

Oracle中ADD_MONTHS()函数详解

文章目录 前言一、ADD_MONTHS()的语法二、主要用途三、测试用例总结 前言 在Oracle数据库中&#xff0c;ADD_MONTHS()函数用于在日期中添加指定的月数。 一、ADD_MONTHS()的语法 ADD_MONTHS(date, n) 其中&#xff0c;date是一个日期值&#xff0c;n是一个整数值&#xff0c…

基于vue框架的大学生学业预警系统设计与实现53ify(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,公告信息,成绩信息,科目,学分信息,考勤信息,教师 开题报告内容 基于Vue框架的大学生学业预警系统设计与实现开题报告 一、研究背景与意义 随着高等教育的普及与深入&#xff0c;大学生群体规模日益扩大&#xff0c;其学业管理成…

百元头戴式耳机哪款口碑爆棚+质价比高?2024耳机最强推荐攻略!

在2024年的耳机市场中&#xff0c;百元头戴式耳机凭借其亲民的价格和出色的性能&#xff0c;成为了众多消费者的首选。随着技术的不断进步&#xff0c;这一价位段的耳机不仅在音质上有了显著提升&#xff0c;还在舒适度、降噪能力以及续航时间等方面表现出色。那百元头戴式耳机…

CAN XL协议标准在CANoe中的应用

众所周知&#xff0c;CAN通信技术在汽车领域中&#xff0c;有着非常广泛的应用。从1991年&#xff0c;第一代经典CAN在奔驰S级轿车中首次应用&#xff1b;到2011年&#xff0c;开始第二代CAN总线&#xff08;即CAN FD&#xff09;的开发&#xff1b;如今&#xff0c;ISO 11898-…

MyBatis 操作数据库入门

目录 前言 1.创建springboot⼯程 2.数据准备 3.配置Mybatis数据库连接信息 4.编写SQL语句&#xff0c;进行测试 前言 什么是MyBatis? MyBatis是⼀款优秀的 持久层 框架&#xff0c;⽤于简化JDBC的开发 Mybatis操作数据库的入门步骤&#xff1a; 1.创建springboot⼯程 2.数…

kwin- 插件加载绘制流程

1. 配置文件的作用具体是做什么的&#xff1f; 相当于用户强制设置了特效的开关&#xff0c;对于没有写在配置文件里的特效&#xff0c;会检测默认加载值&#xff0c;确定是否加载。写在了文件里的会根据返回的值&#xff0c;来加载特效。 2. 为什么配置文件没有写&#xff0c…

【自用】王道文件管理强化笔记

文章目录 操作系统引导:磁盘初始化文件打开过程角度1文件的打开过程角度2 内存映射的文件访问 操作系统引导: ①CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序(先进行硬件自检&#xff0c;再开机) ②)将磁盘的第一块–主引导记录读入内存&…

【Ubuntu】git

文章目录 1.配置SSH key2. 基础知识操作命令1分支branch 如果对git命令使用不熟悉&#xff0c;推荐一个非常棒的git在线练习工具 Learn Git Branching。 https://m.runoob.com/git/git-basic-operations.html 1.配置SSH key ssh-keygen -t rsa -C "YOUR EMAIL"完成…

markdown 中启用音频支持

markdown 中启用音频支持 markdown 默认不支持音频文件&#xff0c;我们通过 html 标签渲染 flask项目 其中音频文件放在 /static/audios/vad_example.wav markdown 内容如下&#xff1a; ## 音频播放器示例 <audio controls ><source src"vad_example.wav…

Flink源码剖析

写在前面 最近一段时间都没有更新博客了&#xff0c;原因有点离谱&#xff0c;在实现flink的两阶段提交的时候&#xff0c;每次执行自定义的notifyCheckpointComplete时候&#xff0c;好像就会停止消费数据&#xff0c;完成notifyComplete后再消费数据&#xff1b;基于上述原因…

go-zero学习

go-zero官网&#xff1a; https://go-zero.dev/docs/tasks 好文&#xff1a; https://blog.csdn.net/m0_63629756/article/details/136599547 视频&#xff1a; https://www.bilibili.com/video/BV18JxUeyECg 微服务基础 根目录下&#xff0c;一个文件夹就是一个微服务。如果微…

力扣16~20题

题16&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 双指针法&#xff0c;和15题差不多&#xff0c;就是要排除了&#xff0c;如果total<target则排除了更小的&#xff08;left右移&#xff09;&#xff0c;如果total>target则排除了更大的&#xff08;rig…

kafka的成神秘籍(java)

kafka的成神秘籍 kafka的简介 ​ Kafka 最初是由Linkedin 即领英公司基于Scala和 Java语言开发的分布式消息发布-订阅系统&#xff0c;现已捐献给Apache软件基金会。Kafka 最被广为人知的是作为一个 消息队列(mq)系统存在&#xff0c;而事实上kafka已然成为一个流行的分布式流…