数组越界的一点心得

c语言中关于数组与指针的一点心得 c语言中关于数组与指针的一点心得 相信大多人刚刚接触C语言的数组时,一定听过类似的话:数组名有时候可以看做指针,但有时候不能看做指针。也一定发现过数组名的地址与对数组名进行取地址运算之后得到的地址相等,相信大多数人也为此困惑,这篇文章就是面对初学者,希望可以解除你们困惑。 数组名什么情况不可以看做指针 (1)数组是sizeof运算符的操作数。 (2)数组是地址运算符&的操作数。 (3)当 阅读详情

今天上午写个c++下的string split函数,遇到了一个非常有趣的现象。

 

没当程序运行结束的时候,都会提示堆栈溢出。

 

出错的部分大概是这样的:

 

程序运行的时候一切正常,结果也正常,但是就是程序结束的时候跳出提示说堆栈溢出。

 

凭感觉,应该是某个参数在程序结束析构的时候由于越界导致无法完全析构,因此才跳出这个提示。

 

首先可疑的就是我定义的这个str字符数组。这个数组我是初始化为空的。

在循环内设置断点,用sizeof看str长度,发现始终是1,而strlen查看字符数,发现是不断变化的。自此发现问题所在。

 

在C中,char []类型变量的存储规则是每一个字符都存储在数组中的一个成员里,因此,如果你用sizeof和strlen分别查看数组的话,你会发现这两个值始终差1,原因是strlen不会计算'/0'入总数量中。这是C语言的正常运行机制。但是在我这个程序里,str始终是1,而strlen却不断变化,这就出现了这种局面:ifs流中的数据全部被存入了str的第一个成员内。从原理上来说这没有任何问题,因为只要ifs中buffer的数据量没有超过一个字节,那么就完全可以正常存入,只不过这种存入方法是非C语言正常存储过程。但是在运行过程中不会报错,因为赋值的过程没任何问题。

 

问题出在释放堆栈的时候,当函数生命周期结束,编译器释放堆栈的时候,会尝试释放str为基地址,长度为strlen+1的内存,但是str的size却是1,因此在释放的时候会报越界错误。数组具体内存情况分配如图:

 

程序结束的时候会尝试释放str,但是当释放到第三个元素的时候发现越界,因此会出现堆栈溢出错误。

 

 

至此,这个BUG的分析就结束了。

 

但是针对这种错误,网上有一种流行的解决方式,就是在c++基本运行时检查,取消rtc,改成默认。

 

RTC是什么,MSDN上有一段是这么说的:

 

检测局部变量(例如数组)的溢出和不足。/RTCs 将不检测当访问内存时由结构内的编译器填充导致的溢出。当使用 align (C++)、/Zp(结构成员对齐)或 pack 时,或者以某种方式对结构元素进行排序以致要求编译器添加填充时,可能发生填充。

 

很明显,RTC一项重要的功能就是检查局部变量堆栈溢出,个人认为取消这个功能有点治标不治本,因此我个人不提倡这种解决方法,发现问题本质,从根本上找出错误所在才是正确的解决方法。

 

 

最后,我那个小程序的解决方法是什么?很简单,给数组定义固定长度,比如说,定义为256,溢出可能性基本就没了。

C++数组越界错误全解析:从内存原理到现代安全编程实践 数组是编程中基础且核心的数据结构,其本质是一段连续的内存区域。在C++这类系统级语言中,数组访问通过计算内存地址直接进行,语言本身默认不执行运行时边界检查,这既是性能优势也带来了安全风险。当索引超出有效范围时,程序会访问非法内存区域,导致数据污染、段错误等未定义行为,严重时甚至可引发安全漏洞。从工程实践角度,理解内存模型和越界后果是编写健壮代码的基础。针对数组越界这一常见问题,现代C++提供了更安全的替代方案,如使用`std::vector`的`.at()`成员函数进行边界检查,或采用范围for循环和迭代器 阅读详情

相关推荐

数字电路基础(CMOS电路、低功耗方法)

文章目录一、CMOS器件1.1.CMOS反相器1.2. CMOS与非门1.3.CMOS或非门1.4 CMOS与门和CMOS或门二、CMOS电路参数——功耗 一、CMOS器件 1.1.CMOS反相器 CMOS反相器实现非门功能,由一个PMOS管和一个NMOS管组成,其逻辑电路图如下: 其真值表如下: In PMOS NMOS Out 0 √ 导通 ×关闭 1 1 ×关闭 √...

Mr.翟的博客 1万+

CPU底层那些事(数组越界也不一定就会出现堆栈溢出)

数组作为一种数据类型。数组越界会咋样?会导致堆栈溢出吗?其实数组越界分两种,一种是数组向高端地址越界、一种是数组向地段地址越界。 1.数组向低端地址越界。 (1)定义一个数组,并依次给数组赋值。 代码: #include <stdio.h> #include <windows.h> void fun1() { long a[2]; a[0] = 1; a[1] = 2; a[-1] = 3; a[-2] = 4; } int main() .

weixin_42536748的博客 1514

ESD笔记(三)_常用ESD保护电路优缺点

根据ESD防护器件的TLP I-V特性我们可将ESD器件分为回滞类和非回滞类两种; 回滞类的ESD器件包括NPN三极管、栅极接地 NMOS ( GGNMOS, Gate-grounded NMOS )、可控桂(SCR, siliconcontrolled rectifier)等。 非回滞类的ESD器件包括二极管、二极管串、沟道工作的MOS管、PNP三极管、栅极接电源的PMOS(GDPMOS)等,与回滞类ESD器件相比,其TLP曲线没有负阻区的存在。 常用于ESD防护的器件包括PN结二极管、GGN

weixin_47139649的博客 1万+

c和c++中字符串的截取

C字符串和C++字符串      在C中,并没有字符串这个数据类型,而是使用字符数组来保存字符串。C字符串实际上就是一个以null('\0')字符结尾的字符数组,null字符表示字符串的结束。需要注意的是:只有以null字符结尾的字符数组才是C字符串,否则只是一般的C字符数组。         C字符串定义时可以利用"="号进行初始化,但是以后不能利用"="对C字符串进行赋值。对C字

Jake_cai的博客 5056

ADS与Cadence中Verilog-A文件的编译与调用实战指南

本文详细介绍了在ADS与Cadence平台中Verilog-A文件的编译与调用实战指南,涵盖开发环境配置、模型创建与编译、仿真设置技巧以及跨平台协作与调试等内容。通过具体案例和优化策略,帮助工程师高效完成混合信号仿真设计,提升电路建模与验证效率。

weixin_29196315的博客 497

Zabbix 7.0 从入门到精通部署手册

zabbix 入门到精通

weixin_43806846的博客 1031

堆栈溢出的常见情况

一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。 例如:

DHL1234567的专栏 4073

从采集到播放:RV1106+H264全链路开发避坑指南(含FFmpeg转码技巧)

本文详细解析了基于Rockchip RV1106芯片构建H.264视频从采集到播放全链路的开发实践。内容涵盖RKMPI框架设计、VI/VENC模块配置、内存泄漏排查及FFmpeg高效转码技巧,旨在帮助嵌入式开发者规避常见陷阱,实现稳定高效的低延迟视频处理流水线。

weixin_29189377的博客 662

C++输入输出总结

在学习C/C++编程,经常会忽略I/O的使用,之前也没有自己做一遍总结。导致后来吃了不少亏,比如开发的时候,会因为忘记cin的某个成员而去查谷歌/百度,导致效率下降。今天,要好好沉思一下,写一篇总结。特别的本文着重针对std::cin,std::cout这两个对象,和iostream流的记录,可能会穿插一点细节,但不会多。输入流对象std::cin平时我们使用的cin,cout,其实是命名空间中的s

陈皮大虾的博客 1022

用SPSS做信效度分析

对问卷进行Cronbach’s Alpha信度检验。如果此值高于0.8,则说明信度高;如果此值介于0.7-0.8之间,则说明信度较好;如果此值介于0.6~0.7,则说明信度可接受;如果此值小于0.6,说明信度不佳。下面利用SPSS进行分析,点击分析–标度–可靠性分析选项,选中所要分析的问卷数据或题目。得到结果,我们要看这个有用的结果,当克隆巴赫Alpha系数(也可以看标准化后的)大于0.8时候,说明问卷信度较高。

小高~的博客 1万+

【crawler笔记】R语言简单动态网页爬虫(rvest包)示例

1、爬虫目标 大家普遍认为Python的爬虫功能强大,但在解决动态加载或者登陆网站时,Python存在一定困难的,相对于一些普通爬虫,使用R语言会更方便。 以https://www.thepaper.cn/为例,爬取首页的新闻(标题、内容、时间),主要采用的是动态网页中常用的httr包。 初始学习时,参考了B站《20分钟入门基于R语言的网络爬虫_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili》的视频,但代码运行出现了报错,所以在原代码上做了修改。 2、代码分析及报错修改 library(rv

seeyouer1205的博客 3275

PAT中段错误的原因及解决方法

PAT中段错误的原因及解决方法 文章目录PAT中段错误的原因及解决方法一.查找方法二.可能原因1.越界访问2.大数组一定要开全局,而不是写在main函数里面。3.sort函数使用错误 一.查找方法 段错误⼀般是由数组越界、堆栈溢出(⽐如,递归调⽤层数太多)等情况引起。 查找的方法也比较简单,首先对可疑的代码注释掉,提交到OJ上试试,如果确实是⾃⼰注释掉的 这段代码发⽣了段错误,那么对应的OJ判题结...

太空漫游人的博客 5675

基于FPGA的多通道音频信号采样系统设计

FPGA是随着数字集成电路的发展而逐步演变而来的。从早期的电子管、晶体管、小规模集成电路,到超大规模集成电路(VLSIC),数字集成电路的集成度和性能不断提升。FPGA的出现为系统设计师提供了灵活的设计平台,使其能够在不依赖半导体厂商的情况下快速设计专用集成电路(ASIC)。FPGA具有设计周期短、成本低、开发工具先进等优点,广泛应用于原型设计和产品生产中。VHDL是一种用于描述数字系统的硬件描述语言,其语言形式类似于计算机高级语言,但包含了许多硬件特征语句。

qq_62634009的博客 709

解决数组越界的一些心得记录

循环判定条件里,只要有数组某个元素的判定值,随着游标的移动,很容易出现数组越界的情况。 根据 and 的特性:只要失败就不判定后面的条件了。所以可以先判断游标是否越界,再判断该游标对应的list中的数据是否符合自己想要的。 ...

ThinkTimes的博客 432

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

javascript的数组一点心得

数组 对于数组,我们首先要弄懂什么是数组。其实数组就是存出一对变量的,内存中连续存储多个数据的存储空间,统一的名字。而我们为什么要使用数组呢,因为要连续存储的多个数据编译维护和查询。 第一步,如何创建这个数组呢,有三种方法,第一种直接创建一个空数组,例如:var arr = []; 第二个创建一个已知数据个数的空数组,例如:var scores = new array(); 3 创建数组同时初...

jh1906338271的博客 273

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java一维数组的学习心得

在上述代码中,Counter类中的Increment方法使用了synchronized关键字进行修饰,以确保在多线程环境下对count变量的操作是原子性的。本文介绍了 Java 中多线程同步的实现方法,包括synchronized关键字、Lock接口和原子类,并结合示例代码进行了讲解。在使用多线程同步时,要注意避免死锁的发生,合理选择锁的粒度,以提高程序的性能和并发性。Java 提供了一些原子类,如AtomicInteger、AtomicLong等,它们提供了原子性的操作,可以避免多线程环境下的并发问题。

2401_82427516的博客 466

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java数组实验心得体会_Java数组学习心得

我以前对C++比较熟悉,所以就想当然将C++中的数组与Java中的数组画上了等号。读过《TIJ》之后我发现并不是这么回事,所以,完全应该重新认识Java中的数组。这篇文章不是对Java中数组的全面介绍,只是我的一些心得。(有些内容转引自《TIJ》)概论:相对于C++中的数组,Java中的数组已经有了很大的改进。首先,Java中的数组是对象,这就意味着与C++中的数组的根本不同,相反,Java中的数...

weixin_39875842的博客 1053

关于java定义属性数组的心得

**关于java定义属性数组的心得**最近学完了java,在做java的联系题目时遇到了很多运用到需要指定类属性为一个数组的情况,但每每到这里都会遇到问题,且问题一般都是数组头指针异常或者干脆就是空指针异常,这个相信大家都不陌生。在查阅很多资料后,整理了一下思路,在这里也与大家分享一下,避免小伙伴走类似的弯路。 为了更好地说明问题,我把我的题目放上去,例如第一题: 编写一个含有5个类的程序

Touch_Thesky的博客 5319

C语言中数组的学习心得

总之,通过学习C语言中的数组,我深刻认识到了数组在编程中的重要性和应用广泛性。在后续的学习过程中,我将继续深入学习和掌握数组的相关知识,并将其应用于实际编程中。在学习数组时,我首先需要理解数组的基本概念,如数组的长度、数组元素的类型、数组元素的访问等。通过学习数组,我深刻认识到数组在C语言中的广泛应用,以及它们在编程中的重要性。通过学习指针与数组的关系,我深刻理解了如何使用指针来操作数组,以及如何通过指针来访问和修改数组元素的值。数组的排序和搜索是编程中常见的操作,也是数组的重要应用之一。

2401_82541086的博客 1339

Java数组学习心得,欢迎拍砖

我以前对C++比较熟悉,所以就想当然将C++中的数组与Java中的数组画上了等号。读过《TIJ》之后我发现并不是这么回事,所以,完全应该重新认识Java中的数组。这篇文章不是对Java中数组的全面介绍,只是我的一些心得。(有些内容转引自《TIJ》)概论:相对于C++中的数组,Java中的数组已经有了很大的改进。首先,Java中的数组是对象,这就意味着与C++中的数组的根本不同,相反,Java中

jjjer的专栏 2973

数组心得(一)

17.1 数组与内存   17.1.1 数组的内存结构   17.1.2 数组的内存地址   17.1.3 数组元素的内存地址   17.1.4 数组访问越界 17.2 二维数组   17.2.1 二维数组基本语法   17.2.2 二维数组初始化   17.2.3 二维数组的内存结构   17.2.4 二维数组的内存地址 17.3 二维数组实例   17.3.1 用二维数组做字模   17.3.

dawang2006的专栏 2938

C语言之数组的学习心得

数组的学习心得 学习了本章的内容后,对数组有了一个大概的认识。对数组的了解可分为以下几个层次。 1.首先了解什么是数组 ​ 数组就是分配一系列的内存空间,方便的把多个数值定义给一个变量,这个变量相当于一排房子,每间房间放一个数值,一个房间代表一个元素,房间里放的不一定是整数,也可以是小数,浮点数,字符等。房间上有门牌号,门牌号就代表了数组中的第几个元素,如a[10]就代表了数组从零开...

weixin_45875696的博客 7688

Java数组学习心得

Java数组学习心得   我以前对C++比较熟悉,所以就想当然将C++中的数组与Java中的数组画上了等号。读过《TIJ》之后我发现并不是这么回事,所以,完全应该重新认识Java中的数组。这篇文章不是对Java中数组的全面介绍,只是我的一些心得。(有些内容转引自《TIJ》) 概论: 相对于C++中的数组,Java中的数组已经有了很大的改进。首先,Java中的数组是对象,这就意味着与C++中的数组的

盗也有道>>>> 1137

树状数组一点心得

树状数组的基本概念不说了,网上大佬们的讲解博客很多。 先上一段我的模板 inline int lowbit(int x) {return x&-x;} inline void update(int x,int val){ for (int i=x; i<maxn; i+=lowbit(i)) tree[i]+=val; ...

diaozha3808的博客 145

关于C++中sizeof()、数组长度和函数传参的一点心得

昨天参加了腾讯2014的s

cclaibryan的专栏 3377

关于指针数组和数组指针的一点心得!

如果你对指针数组和数组指针有很大疑惑,最好的办法就是自己写一些测试代码来验证自己的想法,以下是一段测试程序代码:#include "stdafx.h"#include#includeusing namespace std; int _tmain(int argc, _TCHAR* argv[]){       char * pszArr[2] = {0};  //指

jasonM2008的专栏 1100
上一篇: 调试了一上午的愚蠢BUG
下一篇: 用递归法输出XML的节点value
对象
博客等级 码龄17年 70粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值