「C系列」C 内存管理

文章目录

  • 一、C 内存管理
    • 1. 静态内存分配
    • 2. 栈内存分配
    • 3. 堆内存分配
    • 注意事项
  • 二、C 内存管理的函数和描述
    • 1. `malloc()`
    • 2. `calloc()`
    • 3. `realloc()`
    • 4. `free()`
  • 三、相关链接

一、C 内存管理

C 语言的内存管理主要由程序员负责,这意味着你需要手动分配和释放内存以避免内存泄漏和其他相关问题。C 语言提供了几种用于内存管理的函数和操作符。

1. 静态内存分配

静态内存分配在编译时完成,通常用于定义全局变量、静态变量和数组。这些变量的生命周期是程序执行期间。

int global_var;  // 全局变量,静态分配
static int static_var;  // 静态变量,也是静态分配
int array[10];  // 数组,静态分配

2. 栈内存分配

局部变量(包括函数内的非静态变量)通常在栈上分配。它们的生命周期是它们所在的函数或代码块的执行期间。栈内存由编译器自动管理,无需程序员手动分配和释放。

void function() {int local_var;  // 局部变量,在栈上分配// ...
}

3. 堆内存分配

堆内存用于动态内存分配,这意味着你可以在运行时根据需要分配和释放内存。C 语言提供了几个函数来管理堆内存:

  • malloc():分配指定字节数的内存,并返回一个指向该内存的指针。如果分配失败,则返回 NULL
  • calloc():类似于 malloc(),但会初始化分配的内存为零。它还需要两个参数:要分配的元素的数量和每个元素的大小。
  • realloc():更改先前分配的内存块的大小。它可以扩大或缩小内存块。如果无法重新分配内存,则返回 NULL,并且原始内存块保持不变。
  • free():释放先前通过 malloc()calloc()realloc() 分配的内存。
#include <stdlib.h>int main() {int *dynamic_array;// 分配内存dynamic_array = malloc(10 * sizeof(int));if (dynamic_array == NULL) {// 处理内存分配失败的情况return 1;}// 使用内存for (int i = 0; i < 10; i++) {dynamic_array[i] = i;}// ...// 释放内存free(dynamic_array);dynamic_array = NULL;  // 将指针设置为 NULL 是一个好习惯,可以防止悬挂指针return 0;
}

注意事项

  • 在使用动态内存分配时,务必检查 malloc()calloc()realloc() 的返回值,以确保它们没有返回 NULL
  • 使用 free() 释放内存后,务必将指针设置为 NULL,以防止悬挂指针(即指向已释放内存的指针)。
  • 避免在函数返回时返回局部变量的地址,因为局部变量在函数返回时会被销毁,其内存可能会被其他变量覆盖。
  • 谨慎使用 realloc(),因为它可能会移动内存块。如果 realloc() 无法在原地扩大内存块,它会分配一个新的内存块,并将原始内存块的内容复制到新位置,然后释放原始内存块。这意味着指向原始内存块的指针在 realloc() 调用后可能不再有效。

二、C 内存管理的函数和描述

在C语言中,与内存管理相关的几个主要函数包括 malloc(), calloc(), realloc(), 和 free()。下面我将为这些函数提供详细的描述和案例代码。

1. malloc()

函数描述
malloc() 函数用于动态分配指定字节大小的内存块,并返回一个指向该内存块的指针。如果内存分配失败,则返回 NULL

函数原型

void *malloc(size_t size);

案例代码

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr = malloc(10 * sizeof(int)); // 分配10个整数的内存if (ptr == NULL) {printf("Memory not allocated.\n");exit(0);}// 初始化数组for (int i = 0; i < 10; i++) {ptr[i] = i;}// 打印数组for (int i = 0; i < 10; i++) {printf("%d ", ptr[i]);}// 释放内存free(ptr);ptr = NULL;return 0;
}

2. calloc()

函数描述
calloc() 函数也用于动态分配内存,但与 malloc() 不同的是,它分配的内存会被初始化为零,并且你需要指定元素的数量和每个元素的大小,而不是总的字节数。

函数原型

void *calloc(size_t num, size_t size);

案例代码

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr = calloc(10, sizeof(int)); // 分配10个整数的内存,并初始化为0if (ptr == NULL) {printf("Memory not allocated.\n");exit(0);}// 打印数组(应为全0)for (int i = 0; i < 10; i++) {printf("%d ", ptr[i]);}// 释放内存free(ptr);ptr = NULL;return 0;
}

3. realloc()

函数描述
realloc() 函数用于改变已分配内存块的大小。它尝试在内存中为对象重新分配内存空间,并返回指向新内存块的指针。如果当前内存块足够大,则 realloc() 可能什么也不做并返回原始指针。如果当前内存块不够大,realloc() 会尝试找到一个足够大的内存块,并将原始数据复制到新的内存块中,然后返回新的内存块的指针。如果内存分配失败,则返回 NULL,并且原始内存块保持不变。

函数原型

void *realloc(void *ptr, size_t size);

案例代码

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr = malloc(5 * sizeof(int)); // 初始分配5个整数的内存if (ptr == NULL) {printf("Memory not allocated.\n");exit(0);}// 初始化数组for (int i = 0; i < 5; i++) {ptr[i] = i;}// 重新分配内存到10个整数ptr = realloc(ptr, 10 * sizeof(int));if (ptr == NULL) {printf("Memory reallocation failed.\n");free(ptr); // 尽管失败,但也要尝试释放原始内存exit(0);}// 初始化新分配的内存部分for (int i = 5; i < 10; i++) {ptr[i] = i;}// 打印数组for (int i = 0; i < 10; i++) {printf("%d ", ptr[i]);}// 释放内存free(ptr);ptr = NULL;return 0;
}

4. free()

在C语言中,free() 函数是用于释放之前通过 malloc(), calloc(), 或 realloc() 分配的内存块的。当你不再需要一块动态分配的内存时,应该使用 free() 函数来释放它,以防止内存泄漏。

函数原型

void free(void *ptr);

参数

  • ptr:指向要释放的内存块的指针。这个指针必须是通过 malloc(), calloc(), 或 realloc() 分配得到的,且尚未被 free() 释放。

返回值

free() 函数没有返回值。

注意事项

  1. 不要重复释放:如果你尝试使用 free() 释放同一块内存两次,或者释放一个已经被释放的内存块,程序可能会崩溃或产生不可预测的行为。

  2. 指针置空:在调用 free() 后,最好将指针设置为 NULL。这可以防止对已释放内存的误用(悬挂指针)。

  3. 内存泄漏:如果你忘记释放分配的内存,就会导致内存泄漏。长时间运行的程序如果发生内存泄漏,可能会导致系统资源耗尽。

  4. 内存碎片化:频繁地分配和释放小块内存可能会导致内存碎片化,使得虽然总内存量充足,但无法找到足够大的连续内存块来满足新的分配请求。

案例代码

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr = malloc(10 * sizeof(int)); // 分配10个整数的内存if (ptr == NULL) {printf("Memory not allocated.\n");return 1; // 分配失败,返回非零值}// 使用内存...// 释放内存free(ptr);ptr = NULL; // 防止悬挂指针return 0; // 成功执行
}

在这个例子中,我们首先使用 malloc() 分配了10个整数的内存,并检查是否分配成功。如果分配成功,我们就使用这块内存(虽然在这个简单的例子中我们并没有真正使用它)。然后,我们使用 free() 释放了这块内存,并将指针设置为 NULL,以防止悬挂指针。最后,程序成功执行并返回0。

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C系列」C 简介
  4. 「C系列」C 基本语法
  5. 「C系列」C 数据类型
  6. 「C系列」C 变量及常见问题梳理
  7. 「C系列」C 常量
  8. 「C系列」C 存储类
  9. 「C系列」C 运算符
  10. 「C系列」C 判断/循环
  11. 「C系列」C 函数
  12. 「C系列」C 作用域规则
  13. 「C系列」C 数组
  14. 「C系列」C enum(枚举)
  15. 「C系列」C 指针及其应用案例

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

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

相关文章

通俗范畴论4 范畴的定义

注&#xff1a;由于CSDN无法显示本文章源文件的公式&#xff0c;因此部分下标、字母花体、箭头表示可能会不正常&#xff0c;请读者谅解 范畴的正式定义 上一节我们在没有引入范畴这个数学概念的情况下&#xff0c;直接体验了一个“苹果1”范畴&#xff0c;建立了一个对范畴的…

【新闻】AI程序员要来了吗?阿里云官宣

内容提要 6 月 21 日&#xff0c;在阿里云上海 AI 峰会上&#xff0c;阿里云宣布推出首个AI 程序员。 据介绍&#xff0c;这个AI程序员具备架构师、开发工程师、测试工程师等多种岗位的技能&#xff0c;能一站式自主完成任务分解、代码编写、测试、问题修复、代码提交整个过程…

跨界收益:企业数字化转型的致胜秘密!

在数字化的浪潮中&#xff0c;企业如何突破传统&#xff0c;面向未来&#xff1f;跨界收益&#xff0c;这个看似神秘的力量&#xff0c;正成为企业数字化转型的关键所在&#xff01;让我们一同揭开它的神秘面纱&#xff0c;探寻其中的奥秘吧&#xff01; 在企业数字化转型中&am…

集群环境中分发文件的脚本

由于在集群中手动分发文件较为麻烦&#xff0c;这里记录一下自动分发脚本。 1 脚本说明 该脚本用于将文件分发到远程设备。默认分发文件的路径为脚本所在路径&#xff0c;默认分发目标地址为node1和node2。可以在启动脚本时手动输入分发文件的路径和目标设备地址&#xff0c;…

教育护眼灯品牌排行有哪些上榜?中国十大教育照明品牌分享

在当前的时代背景下&#xff0c;孩子们的课业负担依然沉重。随着他们年龄的增长&#xff0c;作业量不断增加&#xff0c;对视力的需求也随之上升。加之&#xff0c;现今许多作业需借助电子屏幕完成&#xff0c;孩子们面临视力问题的风险因而愈加提早。家长们逐渐认识到&#xf…

一个端口配置两个vue和后端服务,nginx以及前后端服务怎么配?

nginx配置重点看server中的内容&#xff1a; worker_processes 8; pid /usr/local/nginx/logs/nginx.pid;events {# 此为 Linux 系统特为处理大批量文件描述符而作改进的 poll 事件模型use epoll;worker_connections 512; # 工作进程的最大连接数量# 允许同时接受多个网络连…

注意,华为HCIP考试近期变题频繁,请密切关注

最近&#xff0c;华为HCIP考试频繁变题&#xff0c;不少人在后台咨询小编&#xff0c;在此统一回复下。 具体情况是&#xff0c;继HCIP Datacom H12-831在4月份变题后&#xff0c;上周HCIP-Security H12-725也发生了变题。 而本周&#xff0c;HCIP-WLAN H12-323再次变题。 01 变…

静态文件及模板

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 静态文件 动态Web应用也会需要静态文件&#xff0c;通常是CSS和JavaScript文件。Flask可以向已经配置好的Web服务器提供静态文件&#xff0c;只要…

制作微信小程序“飞翔的小鸟”

微信小程序为开发者提供了一个强大的平台&#xff0c;可以快速创建各种有趣的应用。在这篇博客中&#xff0c;我们将介绍如何制作一个简单的微信小程序——“飞翔的小鸟”。 项目介绍 “飞翔的小鸟”是一款基于微信小程序的小游戏&#xff0c;玩家需要控制一只小鸟在障碍物之间…

目前什么牌子充电宝适合入手?性价比高充电宝推荐

在如今这个快节奏的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。然而&#xff0c;手机电量的消耗却常常让我们陷入焦虑之中。当我们身处户外&#xff0c;急需给手机充电时&#xff0c;共享充电宝或许是个应急的选择&#xff0c;但您是否注意到&#xff0c;共享充…

监控系统的4个黄金指标

最近被问到一个问题&#xff0c;是关于监控系统的4个黄金信号&#xff08;也被称为黄金指标&#xff09;的&#xff0c;不太记得了&#xff0c;看了一些资料&#xff0c;做个笔记。 来源 监控系统的4个黄金指标来源于《SRE&#xff1a;Google运维解密》这本书的第六章 分布式…

面试题3:GET 和 POST 有什么区别?

[!]高频面试题。 GET 和 POST 没有本质区别&#xff0c;可以进行相互代替。 1、GET语义&#xff1a;“从服务器获取数据”&#xff1b;POST语义&#xff1a;“往服务器上提交数据”。[设计初衷&#xff0c;不一定要遵守] 2、发请求时&#xff0c;给服务器传递的数据&#xff…

通用大模型VS垂直大模型:你更青睐哪一方?

目录 引言 背景介绍 国内外垂直大模型的发展情况 国内外通用大模型的发展情况 哪一路径更为火热&#xff1f; 能力分析 通用大模型的独特能力 垂直大模型的独特能力 两者的差异与互补 难点探究 算力的挑战 数据的挑战 算法的挑战 结论 表格总结 引言 AI大模型的战…

CMake 详解

CMake 说明 cmake的定义是什么 &#xff1f;-----高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目&#xff0c;最终要输出一个可执行文件或者共享库&#xff08;dll&#xff0c;so等等&#xff09;这时候神器就出现了-----CMake&#xff01; 所有操作都是通过…

Qt封装号的数据库操作类

连接QMYSQL&#xff0c;包含断线重连 头文件&#xff08;xxx.h&#xff09; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QThread.h> #include <QQueue> #include <QMutex> #include <QSqlDatabase> #include …

用一个实例看如何分享大量照片 续篇一

继续上篇的实例分享&#xff0c;在此罗列一些应该注意的细节&#xff0c;以便在下次可以更加省时省力。 最重要的是呈现构想&#xff0c;如按活动/主题、班级/板块、地区/国家等等&#xff0c;这些都应该事先计划好&#xff0c;事后改动工作量巨大&#xff0c;因为太容易出错&a…

中东文明史

转自&#xff1a;想要了解完整的中东文明史&#xff1f;这篇文章成全你 - 知乎 (zhihu.com) 写在前面 中东文明是人类历史上最古老的文明。人类祖先从东非大裂谷走出之后&#xff0c;首先选择定居在中东地区的新月沃土上&#xff0c;并建立了人类历史上有文字记载的第一个文明…

java课程设计GUI学生信息管理系统

目录 系统内容.. 3 用户界面模块... 4 数据存储模块... 4 信息管理模块... 4 管理模块.. 4 主要模块的算法描述... 4 –简要的语言描述... 4 运行及调试分析&#xff08;测试数据及测试结果&#xff09;.. 5 课程设计总结... 7 参考文献&#xff08;至少三个&#xf…

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例&#xff1a; #include <stdio.h>// DALIN PID 结构体定义 typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivativ…

vite:配置打包后js的文件名,解决更新后浏览器缓存问题(了解浏览器的强缓存与协商缓存)

目录 第一章 简单理解浏览器的缓存机制 1.1 什么是缓存 1.2 强缓存 1.3 协商缓存 第二章 配置输出js文件名 2.1 原因 2.2 配置代码 第一章 简单理解浏览器的缓存机制 1.1 什么是缓存 当我们第一次访问网站的时候&#xff0c;我们的电脑会把网站上的图片和数据下载到电…