当前位置: 首页 > ai >正文

(C语言)内存分配函数

malloccallocrealloc区别

malloccallocrealloc均为C语言标准库中的内存分配函数,不过它们的功能和使用场景存在差异。下面为你详细介绍:

功能定义

  1. malloc
void* malloc(size_t size);

此函数会分配一块指定大小(以字节为单位)的内存空间,并且不会对这块内存进行初始化。也就是说,分配后的内存中存储的是之前的随机数据。

  1. calloc
void* calloc(size_t num, size_t size);

该函数用于分配num个元素的内存空间,每个元素的大小为size字节,分配完成后会将所有字节初始化为0。

  1. realloc
void* realloc(void* ptr, size_t new_size);

它的作用是调整之前分配的内存块大小,可以将其扩大或者缩小。如果传入的指针ptrNULL,那么它的功能就和malloc一样。

主要区别

函数初始化情况内存块数量常见应用场景
malloc不初始化,内存中是随机值单个当你需要分配内存,并且会马上用数据填充时
calloc初始化为0多个相同大小的元素为数组或者结构体分配内存,且要求初始值全为0时
realloc不初始化新增的内存区域调整已有内存块的大小需要动态调整内存大小时

使用示例

下面通过一个简单的示例来说明这三个函数的用法:

#include <stdio.h>
#include <stdlib.h>int main() {// 使用malloc分配内存int* ptr1 = (int*)malloc(5 * sizeof(int));printf("malloc分配的内存(未初始化):");for (int i = 0; i < 5; i++) printf("%d ", ptr1[i]);printf("\n");// 使用calloc分配内存int* ptr2 = (int*)calloc(5, sizeof(int));printf("calloc分配的内存(初始化为0):");for (int i = 0; i < 5; i++) printf("%d ", ptr2[i]);printf("\n");// 使用realloc调整内存大小int* ptr3 = (int*)realloc(ptr1, 10 * sizeof(int));printf("realloc调整后的内存(前5个是原来的值,后面未初始化):");for (int i = 0; i < 10; i++) printf("%d ", ptr3[i]);printf("\n");free(ptr2);free(ptr3); // ptr1已被realloc释放return 0;
}

关键注意点

  1. 内存释放:使用这三个函数分配的内存,在使用完毕后都必须用free()函数释放,以避免内存泄漏。
  2. realloc的风险:如果无法扩大原来的内存块,realloc会在其他位置分配新的内存,并把原来的数据复制过去,然后释放原来的内存。所以,在使用realloc时,应该直接使用它返回的指针,而不是原来的指针。
  3. 内存对齐:这三个函数返回的内存地址都保证是适当对齐的,能够用于任何数据类型。
http://www.xdnf.cn/news/7297.html

相关文章:

  • 计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(二)爆炸效果修改图元类型
  • BIM+GIS+loT 技术在大中型水库信息化建设中的融合应用
  • [模型优化] 1. 模型转换
  • SeleniumBase - 多合一浏览器自动化框架
  • python重庆旅游系统-旅游攻略
  • CSS 单位详解:px、rem、em、vw/vh 的区别与使用场景
  • day30-模块和库的导入
  • YOLOv8 在单片机上的几种部署方案
  • 贪心算法:多处最优服务次序、删数问题
  • 【WFAS】《Wild Face Anti-Spoofing Challenge 2023: Benchmark and Results》
  • 数据库存储空间告急?磁盘清理与归档策略全解析
  • ebpf程序入门编写
  • 使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件
  • Lombok
  • Docker 核心原理详解:Namespaces 与 Cgroups 如何实现资源隔离与限制
  • Better Faster Large Language Models via Multi-token Prediction 原理
  • Linux多进程 写时拷贝 物理地址和逻辑地址
  • 在嵌入式系统中, 一般链路层断开多久,断开TCP为好
  • GitHub排名第一的开源ERP项目:Odoo生产计划与执行的功能概述
  • 安装Anaconda后无jupyter解决方法
  • 【NLP】35. 构建高质量标注数据
  • HTTP 协议基础
  • DAY27
  • 【C语言基础语法入门】通过简单实例快速掌握C语言核心概念
  • Golang的Web应用架构设计
  • Python爬虫实战:获取国家统计网最新消费数据并分析,为从业者做参考
  • Profinet转Ethernet IP主站网关:点燃氢醌生产线的智慧之光!
  • 【技术追踪】心脏生理学知识驱动的扩散模型用于无对比剂心肌梗死增强(MICCAI-2024)
  • 云原生安全:错误策略S3存储桶ACL设置为Everyone:FullControl
  • 智能投影仪行业2025数据分析报告