【C语言】动态内存的常见错误

前言:

在上章节中讲解了动态内存的概念和管理的核心函数。

在本章节继续为大家介绍动态内存的常见错误,让大家更好的理解运用。

补充:使用内存函数需要头文件<stdlib.h>

对NULL指针的解引用操作

  1. 当使用malloccallocrealloc等函数分配内存时,如果返回值为NULL(表示分配失败),直接对NULL指针进行解引用会导致程序崩溃。例如:
   int *p = (int*)malloc(10 * sizeof(int));if (p == NULL) 
{// 处理分配失败的情况
}

 

正确的做法是先检查返回值是否为NULL,避免直接使用指针。 

 越界访问

在访问动态分配的内存时,如果超出分配的范围,可能会导致程序崩溃或未定义行为。

例如: 

   int *arr = (int*)malloc(5 * sizeof(int));for (int i = 0; i <= 5; i++) 
{arr[i] = i; // 越界访问
}free(arr);

解决方法是确保访问的索引在有效范围内。

 

释放非动态分配的内存

使用free函数释放非动态分配的内存(如栈上分配的内存)会导致未定义行为。例如:

   int arr[10];free(arr); // 错误:释放栈上分配的内存

应确保只对动态分配的内存调用free

重复释放内存(双重释放)


如果对同一块内存多次调用free函数,会导致程序崩溃或未定义行为。例如:

   int *ptr = (int*)malloc(10 * sizeof(int));free(ptr);free(ptr); // 错误:双重释放

 释放部分内存

如果尝试释放动态分配内存的一部分,会导致未定义行为。例如:

   int *ptr = (int*)malloc(10 * sizeof(int));free(ptr + 2); // 错误:释放部分内存

正确的做法是释放整个内存块。

int main()
{int* p = (int*)malloc(40);if (p == NULL){perror("malloc");return 0;}int i = 0;for (i = 0;i < 10;i++){*p = 5;p++;}free(p);p = NULL;return 0;
}

 

 未初始化的指针使用


使用未初始化的指针可能导致程序崩溃或访问非法内存。例如:

   int *ptr;printf("%d\n", *ptr); // 错误:未初始化的指针

指针在使用前应确保已正确初始化。

内存泄漏

如果分配的内存未被释放,会导致内存泄漏。

例如:

   int *ptr = (int*)malloc(10 * sizeof(int));// 程序结束时未释放内存
void test()
{int* p = (int*)malloc(100);if (*p = NULL){*p = 20;}
}
int main()
{test();while (1);return 0;
}

 

 

 

野指针的使用


已释放的指针或指向不存在内存的指针被称为野指针,使用野指针可能导致程序崩溃。例如:

   int *ptr = (int*)malloc(10 * sizeof(int));free(ptr);printf("%d\n", *ptr); // 错误:野指针

 缓冲区溢出


在访问动态分配的数组时,如果超出数组边界,可能导致缓冲区溢出。例如:

   int *arr = (int*)malloc(5 * sizeof(int));for (int i = 0; i < 6; i++) {arr[i] = i; // 缓冲区溢出}free(arr);

 未检查realloc失败


使用realloc调整内存大小时,如果失败会返回NULL,但原内存块可能仍然有效。例如:

    int *ptr = (int*)malloc(10 * sizeof(int));ptr = (int*)realloc(ptr, 20 * sizeof(int));if (ptr == NULL) {// 处理失败情况}free(ptr);

总结:
C语言中的动态内存管理涉及复杂的操作,容易引发多种错误。开发者应严格遵循以下原则:

  • 在使用前检查指针是否为NULL。
  • 确保访问内存时在有效范围内。
  • 避免重复释放内存。
  • 及时释放不再使用的动态内存。
  • 使用工具(如Valgrind)检测潜在问题。

 

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

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

相关文章

uniapp-x 二维码生成

支持X&#xff0c;二维码生成&#xff0c;支持微信小程序&#xff0c;android&#xff0c;ios&#xff0c;网页 - DCloud 插件市场 免费的单纯用爱发电的

Linux内核之文件驱动随笔

前言 近期需要实现linux系统文件防护功能&#xff0c;故此调研了些许知识&#xff0c;如何实现文件防护功能从而实现针对文件目录防护功能。当被保护的目录&#xff0c;禁止增删改操作。通过内核层面实现相关功能&#xff0c;另外在通过跟应用层面交互从而实现具体的业务功能。…

利用大模型实现地理领域文档中英文自动化翻译

一、 背景描述 在跨国性企业日常经营过程中&#xff0c;经常会遇到专业性较强的文档翻译的需求&#xff0c;例如法律文书、商务合同、技术文档等&#xff1b;以往遇到此类场景&#xff0c;企业内部往往需要指派专人投入数小时甚至数天来整理和翻译&#xff0c;效率低下&#x…

鸿蒙Flutter仓库停止更新?

停止更新 熟悉 Flutter 鸿蒙开发的小伙伴应该知道&#xff0c;Flutter 3.7.12 鸿蒙化 SDK 已经在开源鸿蒙社区发布快一年了&#xff0c; Flutter 3.22.x 的鸿蒙化适配一直由鸿蒙突击队仓库提供&#xff0c;最近有小伙伴反馈已经 2 个多月没有停止更新了&#xff0c;不少人以为停…

(七)深入了解AVFoundation-采集:采集系统架构与 AVCaptureSession 全面梳理

引言 在 iOS 开发中&#xff0c;AVFoundation 是构建音视频功能的强大底层框架。而在音视频功能中&#xff0c;“采集”往往是最基础也是最关键的一环。从摄像头捕捉图形、到麦克风获取声音&#xff0c;构建一条高效且稳定的采集链是开发高质量音视频应用的前提。 本系列将逐…

QML ShaderEffect(着色器效果)组件

ShaderEffect 是 QML 中用于实现自定义着色器效果的组件&#xff0c;允许开发者使用 GLSL 着色器语言创建图形效果。 核心属性 基本属性 属性类型默认值说明fragmentShaderstring""片段着色器代码vertexShaderstring""顶点着色器代码blendingbooltrue是…

基于javaweb的SSM教材征订与发放管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

大模型学习笔记------Llama 3模型架构之分组查询注意力(GQA)

大模型学习笔记------Llama 3模型架构之分组查询注意力&#xff08;GQA&#xff09; 1、分组查询注意力&#xff08;GQA&#xff09;的动机2、 多头注意力&#xff08;Multi-Head Attention, MHA&#xff09;3、 多查询注意力 (Multi-Query Attention&#xff0c;MQA)4、 分组查…

matlab 环形单层柱状图

matlab 环形单层柱状图 matlab 环形单层柱状图 matlab 环形单层柱状图 图片 图片 【图片来源粉丝】 我给他的思路是&#xff1a;直接使用风玫瑰图可以画出。 rose_bar 本次我的更新和这个有些不同&#xff01;是环形柱状图&#xff0c;可调节细节多&#xff1b; 只需要函数…

Docker--Docker网络原理

虚拟网卡 虚拟网卡&#xff08;Virtual Network Interface&#xff0c;简称vNIC&#xff09; 是一种在软件层面模拟的网卡设备&#xff0c;不依赖于物理硬件&#xff0c;而是通过操作系统或虚拟化技术实现网络通信功能。它允许计算机在虚拟环境中模拟物理网卡的行为&#xff0…

linux基础14--dns和web+dns

DNS&#xff1a;域名系统&#xff08;Domain Name System&#xff09; DNS协议是用来将域名转换为IP地址或将IP地址转换为相应的域名 DNS使用TCP和UDP端口53&#xff0c;给用户提供解析时一般使用UDP53 对于每一级域名长度的限制是63个字符&#xff0c;域名总长度则不能超过2…

C++抽象基类定义与使用

在 C 中&#xff0c;抽象基类&#xff08;Abstract Base Class, ABC&#xff09; 是一种特殊的类&#xff0c;用于定义接口规范和约束派生类的行为。它通过纯虚函数&#xff08;Pure Virtual Function&#xff09;强制要求派生类实现特定功能&#xff0c;自身不能被实例化。以下…

用selenium4 webdriver + java 搭建并完成第一个自动化测试脚本

自动化测试任务&#xff1a; 百度搜索自己的姓名。点击第一个链接&#xff08;或者第二个&#xff09;&#xff0c;在新的页面上&#xff0c;添加断言&#xff0c;验证你的名字是否存在。 实验资料百度网盘下载路径&#xff1a; 链接: https://pan.baidu.com/s/1nVlHX_ivres…

LLM大模型中的基础数学工具—— 约束优化

Q26: 推导拉格朗日乘子法 的 KKT 条件 拉格朗日乘子法与 KKT 条件是啥&#xff1f; 拉格朗日乘子法是解决约束优化问题的利器。比如&#xff0c;想最小化函数 &#xff0c;同时满足约束 &#xff0c;就构造拉格朗日函数 &#xff08; 是乘子&#xff09;。KKT 条件是解这类问…

net+MySQL中小民营企业安全生产管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;中小民营企业安全生产管理系统利用计算机网络实现信息化管理&#xff0c;使企业的中小民营企业安全生产管理发展和服务水平有显…

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey 生成式人工智能大型语言模型中的人工智能安全性:一项调查 https://arxiv.org/pdf/2407.18369 https://www.doubao.com…

【MySQL数据库】表的约束

目录 1&#xff0c;空属性 2&#xff0c;默认值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主键primary key 6&#xff0c;自增长auto_increment 7&#xff0c;唯一键unique 8&#xff0c;外键foreign key 在MySQL中&#xff0c;表的约束是指用于插入的…

基于javaweb的SpringBoot校园失物招领系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

多模态大语言模型arxiv论文略读(二十六)

Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文标题&#xff1a;Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文作者&#xff1a;Xinpeng Ding,…

“星睿O6” AI PC开发套件评测 - 部署PVE搭建All in One NAS服务器

Radxa O6平台上部署PVE搭建All in One NAS服务器 Radxa O6是一款性能卓越的单板计算机&#xff0c;其强劲的硬件配置和多样化的接口设计&#xff0c;使其成为家庭和小型企业理想的All in One服务器解决方案。值得一提的是&#xff0c;O6原生配备了两个5G网口&#xff0c;便于直…