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

news/2025/2/23 6:10:21

使用库函数分配和管理内存。在运行时,分配更多的内存给程序使用,主要工具是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函数来释放分配的内存。


http://www.niftyadmin.cn/n/5863079.html

相关文章

商贸物流产业大脑:智能化驱动,赋能商贸物流高效运营

商贸物流产业大脑:智能化驱动,赋能商贸物流高效运营 在数字化转型的浪潮中,商贸物流行业正面临着效率提升、成本控制、服务质量优化等多重挑战。作为全国领先的综合技术解决方案提供商,临沂呆马区块链网络科技有限公司&#xff0…

Python Django系列—入门实例(二)

数据库配置 现在,打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下,​ DATABASES 配置使用 SQLite。如果你是数据库新手,或者只是想尝试 Django,这是最简单的选择。SQLite 包含在 Python 中…

leetcode hot100-34 合并K个升序链表

方法一:分治法(相当于对暴力法的优化) class Solution { private:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode* dummyhead new ListNode(0);ListNode* cur dummyhead;while (list1 && list2) {if (list…

bpmn.js + Node.js_构建高效的后端工作流处理系统

1. 引言 1.1 研究背景与意义 随着企业业务的复杂化,传统的流程管理工具已难以满足需求。BPMN(Business Process Model and Notation)作为一种标准化的流程建模语言,结合 bpmn.js 和 Node.js 可以实现高效的工作流管理系统,提升企业的运营效率。 1.3 BPMN 和 bpmn.js 简…

最新版本Exoplayer(MediaX)实现K歌原伴唱包括单音轨和双音轨

在做K歌类项目中,原伴唱切换是必不可少的基础功能,一般一首完整的歌曲要包含MV视频原唱音频伴唱音频歌词。 而原伴唱音频有两种形式: 1.双音轨:音轨一是原唱,音轨二是伴唱 2.单音轨:左声道是原唱&#x…

Web自动化中Selenium下Chrome与Edge的Webdriver常用Options参数

目录 引言 说明 Add_argument() 添加方式 常用参数 Add_experimental_option() 添加方式 常用方法 任务结束后仍然保持浏览器打开 禁用“Chrome 正受到自动测试软件的控制”提示 设置下载路径 禁用弹窗拦截 禁用图片加载 禁用 JavaScript 注意 引言 …

UITextView删除原有字符串时,光标会上移并且光标会变高

代码运行效果如图: import Foundationclass TestVC: UIViewController {override func viewDidLoad() {super.viewDidLoad()let testV MyCustomTextView(frame: CGRect(x: 0, y: 130, width: SCREEN_WIDTH - 50, height: 170))self.view.addSubview(testV)testV.ba…

23种设计模式之《桥接模式(Bridge)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式&#xff0…