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

C语言的内存分配:malloc和free

使用库函数分配和管理内存。在运行时,分配更多的内存给程序使用,主要工具是malloc函数,这个函数接受一个参数:所需要要的内存字节数。malloc函数会找到合适的空闲内存块,这样的内存是匿名的,即malloc分配了内存后,不会为其赋名,返回动态分配内存块的首字节地址,我们可以将这个地址赋给一个指针变量,使用这个指针访问这块内存。

malloc函数的返回类型通常被定义为指向char的指针。从ANSI C标准开始,C使用一个新的类型:指向void的指针,该类型相当于一个通用指针。malloc可用于返回指向数组的指针、指向结构体指针等,所以通常该函数的返回值会被强制转换为匹配的类型。在ANSI C中,我们应该坚持使用强制类型转换,因为这样可以提高代码的可读性,否则,我们就不容易记住这个指针所指向的实际类型,这样的阅读性就大打折扣。把指针void的指针赋给任意类型的指针完全不用考虑类型匹配的问题。如果malloc申请内存分配失败,会返回空指针。

double* ptd;
ptd = (double*)malloc(30*sizeof(double));

声明数组有三种方式:

- 声明数组时,用常量表达式表示数组的维度,用数组名访问数组的元素。可以用静态内存成功动态创建这种数组。

- 声明变长数组时,用变量表达式表示数组的维度,用数组名访问数组元素,这种数组只能在自动内存中创建。

- 声明一个指针,调用malloc函数,将其返回值赋给指针,使用指针访问数组元素,该指针可以是自动或静态的。

动态分配内存的存储期从调用malloc函数分配内存到调用free函数释放内存为止。malloc函数要和free函数一起使用,free函数的参数是malloc返回的指针,free用于释放之前malloc申请的内存。

静态内存的数量在编译时固定的。在程序运行期间也不会改变。自动变量使用的内存数量在程序执行期间自动增加或减少。但动态分配的内存数量只会增加,除非调用free来进行释放。

分配内存还可用使用calloc函数:

double* buf;
buf = (double*)calloc(100,sizeof(double));

和malloc函数一样, 在ANSI C之前,calloc函数也返回指向char的指针,在ANSI C之后,返回指向void的指针。如果存储不同的类型,应使用强制类型转换运算符。calloc接受两个参数,一个是所需要的存储单元的数量,第二个参数为存储单元的大小(以字节为单位)。

calloc函数有一个特点,会把块中的所位位置都设置为0.calloc函数也需要要用free函数来释放分配的内存。

相关文章:

  • 【精调】LLaMA-Factory 快速开始4 自定义个一个sharegpt数据集并训练
  • 使用 C++ 和 gRPC 的常见陷阱及解决方案
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数
  • 自注意力机制和CNN的区别
  • 安装Bash completion解决tab不能补全问题
  • 普通人怎样用好Deepseek?
  • leetcode刷题记录(一百一十六)——5. 最长回文子串
  • AutoGen 技术博客系列 九:从 v0.2 到 v0.4 的迁移指南
  • 【多语言生态篇四】【DeepSeek×Rust:安全内存管理实践】
  • 断开ssh连接程序继续运行
  • 【进程 】
  • Windows系统本地部署DeepSeek-R1+本地知识库+联网搜索+Agent功能
  • 每日定投40刀BTC(4)20250218 - 20250222
  • Linux 驱动入门(5)—— DHT11(温湿度传感器)驱动
  • 迎接2025,立个flag
  • uniapp 中使用天地图,安卓端、h5
  • 解析多模态、Agent与Code模型的演进
  • 用Python实现Excel数据同步到飞书文档
  • 如何选择近视泳镜的度数
  • 自制操作系统学习第七天
  • IPO周报|节后首批3只新股本周申购,色谱设备龙头来了
  • 贵州省黔西市发生载人游船侧翻事故
  • 五问舆论漩涡中的“协和‘4+4’模式”:是否公平,如何合格?
  • 经济日报:合力推进民企与毕业生双向奔赴
  • 解放日报头版:上海张江模力社区托举“年轻的事业”
  • 新华每日电讯“关爱青年成长”三连评:青春应有多样的精彩