[c语言日寄]越界访问:意外的死循环

在这里插入图片描述

【作者主页】siy2333
【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是进阶开发者,这里都能满足你的需求!
【食用方法】1.根据题目自行尝试 2.查看基础思路完善题解 3.学习拓展算法
【Gitee链接】资源保存在我的Gitee仓库:https://gitee.com/siy2333/study


文章目录

  • 前言
  • 一、案例
  • 二、越界访问
    • 什么是越界访问
    • 越界访问一般发生在什么地方
      • 数组操作
      • 指针操作
      • 字符串操作
      • 动态内存分配
      • 结构体和联合体操作
      • 函数调用和参数传递
      • 系统调用和库函数
      • 并发和多线程
      • 网络编程
  • 三、如何避免越界访问
    • 数组操作
    • 指针操作
    • 字符串操作
    • 动态内存分配
    • 结构体和联合体操作
  • 四、回归案例分析
  • 总结


前言

越界访问是一种常见的程序错误,本篇文章将基于一个案例,从什么是数组越界,数组越界经常发生在什么地方,如何预防数据越界三方面来详细介绍该错误。


一、案例

查看以下c语言代码,试写出其运行结果,并说明理由:

#include <stdio.h>
int main()
{int i = 0;int arr[] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 0; i <= 12; i++){arr[i] = 0;//数组越界访问printf("%d\t",i);}return 0;
}

这个代码非常简洁,我们可以很容易的发现其中i的范围是1-12,但是arr数组的大小只有10个int类型,出现了越界访问。

我们在vs2022中,在debug、x86环境下,运行该代码,结果如下:

在这里插入图片描述

没错,出现了死循环。但是,为什么呢?

二、越界访问

什么是越界访问

越界访问(Out-of-Bounds Access),也称为缓冲区溢出或越界读写,是一种常见的程序错误。它指的是程序试图访问超出其分配的内存空间的数据。这种行为可能会导致程序崩溃或者被利用来进行恶意攻击。

越界访问一般发生在什么地方

数组操作

  • 数组索引超出范围:这是最常见的越界访问类型。例如,对于一个大小为10的数组,尝试访问第11个元素(索引为10)就会导致越界。
  • 循环控制不当:在循环中,如果循环条件或索引更新逻辑有误,可能会导致索引超出数组范围。例如:
int arr[10];
for (int i = 0; i <= 10; i++) { // 错误:i <= 10arr[i] = i;
}

指针操作

  • 未初始化的指针:如果指针没有被正确初始化,它可能指向一个随机的内存地址,解引用这样的指针会导致越界访问。
  • 野指针:指针指向了一个已经被释放或从未分配的内存区域。
  • 指针偏移错误:通过指针进行偏移操作时,如果偏移量计算错误,可能会导致指针指向无效的内存地址。
int arr[10];
int* ptr = arr;
ptr += 11; // 错误:ptr指向了数组范围之外
*ptr = 42; // 越界访问

字符串操作

  • 字符串长度错误:在处理字符串时,如果字符串长度计算错误,可能会导致越界访问。例如,使用strcpy时,目标字符串的缓冲区大小不足以容纳源字符串,就会导致越界。
  • 字符串函数使用不当:使用如strcpy、strcat等不安全的字符串函数,而不是strncpy、strncat等安全的函数,容易导致越界。例如:
char dest[10];
char src[] = "Hello, World!";
strcpy(dest, src); // 错误:src长度超过dest的大小

动态内存分配

  • 分配大小错误:在使用malloc、calloc或realloc分配内存时,如果分配的大小不足以满足需求,可能会导致越界访问。
  • 释放后使用:释放了动态分配的内存后,仍然尝试访问该内存区域,会导致越界访问。例如:
int* ptr = (int*)malloc(10 * sizeof(int));
free(ptr);
*ptr = 42; // 错误:ptr指向的内存已经释放

结构体和联合体操作

  • 结构体成员访问错误:如果结构体的成员访问逻辑有误,可能会导致越界访问。例如,访问结构体中不存在的成员。
  • 联合体使用不当:联合体中的成员共享同一块内存,如果访问联合体成员时没有正确处理,可能会导致越界访问。

函数调用和参数传递

  • 函数参数错误:传递给函数的参数如果超出预期范围,可能会导致函数内部的越界访问。例如,传递给函数的数组指针和数组大小参数不匹配。
  • 递归调用错误:在递归函数中,如果递归条件或递归深度控制不当,可能会导致越界访问。

系统调用和库函数

  • 系统调用参数错误:在调用系统函数时,如果传递的参数不正确,可能会导致越界访问。例如,使用read或write系统调用时,传递的缓冲区大小参数错误。
  • 库函数使用不当:使用标准库函数时,如果参数不正确或使用方式不当,可能会导致越界访问。例如,使用memcpy时,目标缓冲区大小不足以容纳源数据。

并发和多线程

  • 线程同步错误:在多线程环境中,如果线程同步机制不正确,可能会导致多个线程同时访问同一块内存,从而导致越界访问。
  • 线程局部存储错误:如果线程局部存储的使用不当,可能会导致越界访问。

网络编程

  • 网络数据处理错误:在处理网络数据时,如果数据长度计算错误或缓冲区管理不当,可能会导致越界访问。例如,接收的网络数据长度超过缓冲区大小。
  • 协议解析错误:在解析网络协议时,如果协议解析逻辑有误,可能会导致越界访问。

三、如何避免越界访问

数组操作

  • 检查索引范围:在访问数组元素之前,始终检查索引是否在合法范围内。
int arr[10];
for (int i = 0; i < 10; i++) {arr[i] = i;
}
  • 使用安全的数组操作函数:在C语言中,可以使用如strncpy、strncat等安全的字符串操作函数,而不是strcpy、strcat等可能导致越界的函数。
char dest[10];
char src[] = "Hello, World!";
strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0'; // 确保字符串以null字符结尾

指针操作

  • 初始化指针:确保指针在使用前被正确初始化。
int* ptr = NULL;
ptr = (int*)malloc(10 * sizeof(int));
if (ptr == NULL) {// 处理内存分配失败的情况
}
  • 检查指针有效性:在解引用指针之前,检查指针是否指向有效的内存地址。
if (ptr != NULL) {*ptr = 42;
}
  • 避免野指针:释放指针后,立即将其设置为NULL,以避免后续误用。
free(ptr);
ptr = NULL;

字符串操作

使用安全的字符串函数:使用如strncpy、strncat等安全的字符串操作函数,而不是strcpy、strcat等可能导致越界的函数。

char dest[10];
char src[] = "Hello, World!";
strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0'; // 确保字符串以null字符结尾

动态内存分配

  • 检查分配大小:在使用malloc、calloc或realloc分配内存时,确保分配的大小足以满足需求。
int* ptr = (int*)malloc(10 * sizeof(int));
if (ptr == NULL) {// 处理内存分配失败的情况
}
  • 释放后不再使用:释放了动态分配的内存后,立即将指针设置为NULL,以避免后续误用。
free(ptr);
ptr = NULL;

结构体和联合体操作

  • 检查结构体成员访问:在访问结构体成员时,确保成员存在且访问逻辑正确。
struct {int a;int b;
} s;
s.a = 10; // 正确
// s.c = 20; // 错误:结构体中没有成员c
  • 正确使用联合体:联合体中的成员共享同一块内存,确保访问联合体成员时逻辑正确。
union {int a;char b[4];
} u;
u.a = 0x12345678;
// 正确访问联合体成员

四、回归案例分析

我们在第八行添加一个断点,并对代码进行调试:
在这里插入图片描述
我们在监视窗口下,逐步观察值的变化:
在这里插入图片描述
可以看到,我们的前十次for循环是正常运行的:在这里插入图片描述
那么问题就出现在数组越界后了,我们可以修改监视窗口,使得arr[10]、arr[11]、arr[12]也可以显示出来。
在这里插入图片描述
此时,我们可以发现,arr[10]、arr[11]是随机值,但是arr[12]储存了一个值。当我们执行到arr[12]被修改时,监视如下:

在这里插入图片描述
没错!i的值被改变了!那么我们可以猜测,i的值是否就是储存在arr[12]处?使用监视验证这个猜想:

在这里插入图片描述

答案出来了,可以看见arr[12]的地址和i的地址一模一样,即因为数组越界访问,使得i的值永远无法达到跳出循环的条件。

因此,出现了死循环现象。

总结

通过本文的案例分析,我们深入探讨了数组越界访问这一常见错误。越界访问不仅会导致程序崩溃,还可能引发安全漏洞。本文从越界访问的定义、常见场景及预防方法三个方面进行了详细阐述。在案例中,通过调试,我们发现数组越界访问导致循环变量 i 的值被意外修改,从而引发死循环。

关注窝,每三天至少更新一篇优质c语言题目详解~

[专栏链接QwQ] :⌈c语言日寄⌋CSDN
[关注博主ava]:siy2333
感谢观看~ 我们下次再见!!

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

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

相关文章

数据分析系列--①RapidMiner软件安装

目录 一、软件下载及账号注册 1.软件下载 1.1 CSDN下载国内下载,国内镜像相对快,点击下载 1.2 官网软件下载地址:AI Studio 2025.0 ,服务器在国外相对较慢. 2.软件注册 2.1 点击 注册界面 开始注册,如图: 3.邮箱验证 二、软件安装 1. 新年文件夹,名字最好为英文名 2. 双…

新增文章功能

总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 之前又偷懒几天。回老家没事干&#xff0c;玩也玩不好&#xff0c;一玩老是被家里人说。写代码吧还是&#xff0c;他们都看不懂&a…

LangGraph系列-1:用LangGraph构建简单聊天机器人

在快速发展的人工智能和大型语言模型&#xff08;llm&#xff09;世界中&#xff0c;开发人员不断寻求创建更灵活、更强大、更直观的人工智能代理的方法。 虽然LangChain已经改变了这个领域的游戏规则&#xff0c;允许创建复杂的链和代理&#xff0c;但对代理运行时的更复杂控制…

二叉树的最大深度(遍历思想+分解思想)

Problem: 104. 二叉树的最大深度 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(实则二叉树的先序遍历) 1.欲望求出最大的深度&#xff0c;先可以记录一个变量res&#xff0c;同时记录每次当前节点所在的层数depth 2.在递的过程中&#xff0c;每次递一层&#xff0…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 导入需要的类# Important: # 你需要通过以下指令把 form.ui转为ui…

WSL 安装cuDNN

WSL 安装cuDNN 参考文档&#xff1a;https://docs.nvidia.com/deeplearning/cudnn/installation/latest/linux.html#verifying-the-install-on-linux 1. 下载相应包 根据下方下载地址进入下载界面&#xff0c;并选择与自己电脑相对应的平台执行图中的命令 下载地址&#xff1…

58.界面参数传递给Command C#例子 WPF例子

界面参数的传递&#xff0c;界面参数是如何从前台传送到后台的。 param 参数是从界面传递到命令的。这个过程通常涉及以下几个步骤&#xff1a; 数据绑定&#xff1a;界面元素&#xff08;如按钮&#xff09;的 Command 属性绑定到视图模型中的 RelayCommand 实例。同时&#x…

阿里云域名备案

一、下载阿里云App 手机应用商店搜索"阿里云",点击安装。 二、登录阿里云账号 三、打开"ICP备案" 点击"运维"页面的"ICP备案"。 四、点击"新增网站/App" 若无备案信息,则先新增备案信息。 五、开始备案

sunrays-framework配置重构

文章目录 1.common-log4j2-starter1.目录结构2.Log4j2Properties.java 新增两个属性3.Log4j2AutoConfiguration.java 条件注入LogAspect4.ApplicationEnvironmentPreparedListener.java 从Log4j2Properties.java中定义的配置读取信息 2.common-minio-starter1.MinioProperties.…

如何解决跨浏览器兼容性问题

跨浏览器兼容性问题是指同一网页在不同浏览器中呈现效果不一致,通常由于浏览器渲染引擎、CSS支持、JavaScript执行等差异导致。解决这类问题可以从以下几个方面入手: 一、使用标准化的HTML和CSS 确保你的网页符合W3C标准。浏览器会尽量遵循这些标准,所以通过标准化的代码可…

算法12(力扣739)-每日温度

1、问题 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 2、示例 &#…

54.数字翻译成字符串的可能性|Marscode AI刷题

1.题目 问题描述 小M获得了一个任务&#xff0c;需要将数字翻译成字符串。翻译规则是&#xff1a;0对应"a"&#xff0c;1对应"b"&#xff0c;依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的…

立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口

#原代码用的AI模型是minimax的API接口&#xff0c;现在试着改成最热门的deepseek3接口。# 首先按理解所得&#xff0c;在main文件夹下&#xff0c;有minimax.c和minimax.h, 它们是这个API接口的头文件和实现文件&#xff0c;然后在main.c中被调用。所以我们一步步更改。 申请…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1.新建过程 2.算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…

Airflow:精通Airflow任务依赖

任务依赖关系是任何工作流管理系统的核心概念&#xff0c;Apache Airflow也不例外。它们确定在工作流中执行任务的顺序和条件&#xff0c;确保以正确的顺序完成任务&#xff0c;并确保在相关任务开始之前成功完成先决任务。在本文中我们将探讨Apache Airflow中的任务依赖关系&a…

关于WPF中ComboBox文本查询功能

一种方法是使用事件&#xff08;包括MVVM的绑定&#xff09; <ComboBox TextBoxBase.TextChanged"ComboBox_TextChanged" /> 然而运行时就会发现&#xff0c;这个事件在疯狂的触发&#xff0c;很频繁 在实际应用中&#xff0c;如果关联查询数据库&#xff0…

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能…

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台

1 项目简介&#xff08;开源地址在文章结尾&#xff09; 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频&#xff0c;甄别分类、实况分析鸟类保护动物&#xff0c;与全世界各地的用户&…

DeepSeek R1学习

0.回顾&#xff1a; https://blog.csdn.net/Together_CZ/article/details/144431432?ops_request_misc%257B%2522request%255Fid%2522%253A%25226574a586f0850d0329fbb720e5b8d5a9%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id…

25美赛ABCDEF题详细建模过程+可视化图表+参考论文+写作模版+数据预处理

详情见该链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 25美国大学生数学建模如何准备&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客文章浏览阅读791次&#xff0c;点赞13次&#xff0c;收藏7次。通过了解比赛基本…