C语言高频面试题——malloc 和 calloc区别

在 C 语言中,malloccalloc 都是用于动态内存分配的函数,但它们在 内存初始化参数形式使用场景 上有显著区别。以下是详细的对比分析:


1. 函数原型

malloc
void* malloc(size_t size);
  • 功能:分配 未初始化 的连续内存块。
  • 参数:需要分配的内存大小(以字节为单位)。
  • 返回值:指向分配内存的指针,失败时返回 NULL
calloc
void* calloc(size_t num, size_t size);
  • 功能:分配 初始化为零 的连续内存块。
  • 参数
    • num:要分配的元素个数。
    • size:每个元素的大小(以字节为单位)。
  • 返回值:指向分配内存的指针,失败时返回 NULL

2. 核心区别

特性malloccalloc
初始化不初始化内存(内容随机)自动将内存初始化为零
参数形式单一参数(总字节数)两个参数(元素个数 + 单个元素大小)
适用场景需要手动初始化的场景需要零初始化的场景(如数组、结构体)
性能更快(无需清零内存)较慢(需额外时间初始化内存)

3. 初始化差异

malloc 的未初始化内存
  • 分配的内存块内容是随机的(可能包含垃圾值)。
  • 示例:
    int* ptr = malloc(5 * sizeof(int));
    if (ptr) {printf("%d\n", ptr[0]); // 输出随机值
    }
    
calloc 的零初始化
  • 分配的内存块会被初始化为零(所有位为 0)。
  • 示例:
    int* ptr = calloc(5, sizeof(int));
    if (ptr) {printf("%d\n", ptr[0]); // 输出 0
    }
    

4. 参数形式对比

malloc 的参数
  • 需要手动计算总字节数。
  • 示例:分配 5 个整数的内存:
    int* ptr = malloc(5 * sizeof(int)); // 总字节数 = 5 * sizeof(int)
    
calloc 的参数
  • 直接指定元素个数和单个元素大小,自动计算总字节数。
  • 示例:分配 5 个整数的内存:
    int* ptr = calloc(5, sizeof(int)); // 自动计算 5 * sizeof(int)
    

5. 使用场景

使用 malloc 的情况
  • 需要动态分配内存,但后续会手动初始化。
  • 性能敏感的场景(避免初始化开销)。
  • 示例:
    struct Point {int x;int y;
    };
    struct Point* p = malloc(sizeof(struct Point));
    if (p) {p->x = 10; // 手动初始化p->y = 20;
    }
    
使用 calloc 的情况
  • 需要零初始化的场景(如数组、避免未定义行为)。
  • 分配大型数据结构时(如动态数组)。
  • 示例:
    int* arr = calloc(100, sizeof(int)); // 分配并初始化为 0
    if (arr) {printf("%d\n", arr[50]); // 输出 0
    }
    

6. 错误处理

无论是 malloc 还是 calloc,都必须检查返回值是否为 NULL

int* ptr = malloc(1000 * sizeof(int));
if (ptr == NULL) {fprintf(stderr, "Memory allocation failed!");exit(EXIT_FAILURE);
}

7. 释放内存

两者分配的内存都必须通过 free 释放:

free(ptr);
ptr = NULL; // 避免悬空指针

总结

  • malloc
    • 快速分配,但需要手动初始化。
    • 适合需要自定义初始化的场景。
  • calloc
    • 自动零初始化,适合数组或需要安全默认值的场景。
    • 分配大块内存时可能稍慢。

选择建议

  • 如果需要零初始化,优先使用 calloc
  • 如果需要手动控制初始化过程,使用 malloc

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

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

相关文章

Qt -对象树

博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 前言构造QObject::QObjectQObjectPrivate::setParent_helper 析构提醒 #mermaid-svg-FTUpJmKG24FY3dZY {font-family:"trebuchet ms",verdana,arial,sans-s…

JavaScript与TypeScript

TypeScript 和 JavaScript 都是用于构建 Web 应用的编程语言,但它们有着不同的设计目标和特性。 一、JavaScript 1. 定义与特点 动态脚本语言:由 Brendan Eich 在 1995 年创建,最初用于浏览器端的交互逻辑。弱类型/动态类型:变量…

教育行业网络安全:守护学校终端安全,筑牢教育行业网络安全防线!

教育行业面临的终端安全问题日益突出,主要源于教育信息化进程的加速、终端设备多样化以及网络环境的开放性。 以下是教育行业终端安全面临的主要挑战: 1、设备类型复杂化 问题:教育机构使用的终端设备包括PC、服务器等,操作系统…

Linux常见指令介绍中(入门级)

1. man 在Linux中,man命令是用于查看命令手册页的工具,它可以帮助用户了解各种命令、函数、系统调用等的详细使用方法和相关信息。 用法:在终端中输入man加上要查询的命令或工具名称,例如man ls,就会显示ls命令的手册…

linux安装mysql数据库

1.判断系统是多少位的 file /sbin/init2.下载linux安装包 5.7.25.64位安装包链接:https://pan.baidu.com/s/13vFuRikwJaI96K0AmUQXzg提取码:ga7h其他版本安装 去官网下载:https://dev.mysql.com/downloads/mysql/3.创建mysql文件夹 mkdir /…

基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention

基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention 随着人工智能技术的飞速发展,回归预测任务在很多领域得到了广泛的应用。尤其在金融、气象、医疗等领域,精确的回归预测模型能够为决策者提供宝贵的参考信息。为…

深度解析算法之位运算

33.常见位运算 1.基础位运算 << 左移操作符 > >右移操作符号 ~取反 &按位与&#xff1a;有0就是0 |按位或&#xff1a;有1就是1 ^按位异或&#xff1a;相同为0&#xff0c;不用的话就是1 /无进位相加 0 1 0 0 1 1 0 1 0 按位与结果 0 1 1 按位或结果 0 0 1 …

python生成项目依赖文件requirements.txt

文章目录 通过pip freeze去生成通过pipreqs去生成 通过pip freeze去生成 pip freeze > requirements.txt会将整个python的Interceptor的环境下lib包下所有的依赖都生成到这个文件当中&#xff0c;取决于我们使用的python的版本下所有的安装包。不建议使用这种方式&#xff…

C++11特性补充

目录 lambda表达式 定义 捕捉的方式 可变模板参数 递归函数方式展开参数包 数组展开参数包 移动构造和移动赋值 包装器 绑定bind 智能指针 RAII auto_ptr unique_ptr shared_ptr 循环引用 weak_ptr 补充 总结 特殊类的设计 不能被拷贝的类 只能在堆上创建…

C语言之高校学生信息快速查询系统的实现

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之高校学生信息快速查询系统的实现 目录 任务陈述与分析 问题陈述问题分析 数据结构设…

关于进程状态

目录 进程的各种状态 运行状态 阻塞状态 挂起状态 linux中的进程状态、 进程状态查看 S状态&#xff08;浅睡眠&#xff09; t 状态&#xff08;追踪状态&#xff09; T状态&#xff08;暂停状态&#xff09; ​编辑 kill命令手册 D状态&#xff08;深度睡眠&#…

【网络编程】从零开始彻底了解网络编程(二)

本篇博客给大家带来的是网络编程的知识点,. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺便进步 1. …