首页 > 其他分享 >数组越界导致的死循环,以及对存储方式的思考

数组越界导致的死循环,以及对存储方式的思考

时间:2023-06-22 12:03:25浏览次数:33  
标签:arr 数组 int 存储 越界 地址 版本 死循环

一、bug

有如下代码:

int main() {
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0;i <= 12;i++) {
		printf("hehe\n");
		arr[i] = 0;
	}
	return 0;
}

按正常思路,该代码会打印13个hehe,并把arr数组里的10个元素改为0,但为什么计算机会死循环打印无数个hehe?

二、原因分析

简述:数组越界,导致在for循环中执行到arr[12]=0时,把 i 重新赋值为0,所以继续循环,这与数据的存储方式有关

局部变量存储在栈区,栈区以压栈的方式存储,先存高地址,再存低地址。

数组越界导致的死循环,以及对存储方式的思考,relese和debug版本的区别_数组

数组越界导致的死循环,以及对存储方式的思考,relese和debug版本的区别_数组_02

我们在定义int i 时,i 以高地址存在内存中,之后空了两个整形位(与编译器的种类有关),然后再预留10个整形位存储数组

arr,数组内部存储由低地址到高地址。

所以死循环的核心原因是:arr[12]的地址就是i的地址

三、解决方法

通过限制条件阻止数组越界

四、release和debug版本

1.release版本是代码的发布版本,主要是为用户使用,不具有调试功能,占用的内存小

2.debug版本是代码的调试版本,主要是为程序员调试用,占用的内存大

对于该bug,通过实践可得,release版本会进行优化,改变arr和i在内存中的位置,所以不会像debug版本一样死循环

标签:arr,数组,int,存储,越界,地址,版本,死循环
From: https://blog.51cto.com/u_16102535/6534565

相关文章

  • Android,两个互相影响的EditText如何避免死循环
    简单来说,是一个类似如下的需求:两个EditText,假设名字分别是et1和et2;et1的值*一个数字,假设是4500=et2的值;当et1的值发生变化时,et2的值也发生变化,et2的值发生变化时,et1的值也发生变化,用过用简单的 TextWatcher就会发生死循环,如何避免,下面是这个例子代码的最核心部分,简单来说就......
  • Objective C数组的内存管理
    在addObj后及时释放所添加的objectNSMutableArray*array=[NSMutableArraynew];NSString*str=[[NSStringalloc]initWithFormat:@"a"];[arrayaddObject:str];[strrelease];[arrayrelease];也就是说当你吧str放进array的时候,相当于创建了一个str的副本,而这个副本......
  • 【剑指Offer】35、数组中的逆序对
    【剑指Offer】35、数组中的逆序对题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。即输出P%1000000007。输入描述:题目保证输入的数组中没有的相同的数......
  • C语言中数组和指针
    (文章目录)前言本文将给大家带来C语言中非常重要的两个知识点,指针和数组。一、指针的概念指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,指针既然都用来存放地址了那就说明指针也是一个变量。二、指......
  • 102 数组转字符串;反转字符串
    publicclassStr3{publicstaticvoidmain(String[]args){//将数组转【字,符,串】//数组int[]arrNum={1,2,3,4,5};Stringss=getStr(arrNum);System.out.println(ss);}//获得一个拼接后的字符串publics......
  • 20230303 2.0. 数组和链表
    数组数组是最基本的构造类型,它是一组相同类型数据的有序集合。数组中的元素在内存中连续存放,用数组名和下标可以唯一地确定数组元素。链表链表是一种重要的基础数据结构,也是实现复杂数据结构的重要手段。它不按照线性的顺序存储数据,而是由若干个同一结构类型的“结点”依次......
  • [Leetcode] 0724. 寻找数组的中心下标
    724.寻找数组的中心下标点击上方,跳转至leetcode题目描述给你一个整数数组 nums,请计算数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为0,因为在下标的左侧不存在元素。......
  • 精通c语言中的指针-数组
    一维数组:intara[3]={1,2,3};printf("%d\n",ara):printf("%d\n",&ara):打印之后,发现ara和&ara两个值是一样的,为什么?按照我们学习的理解,&ara是取ara的地址,一个是地址,一个是值,不应该一样,那为什么打印出来会是一样的? 从汇编的角度可以解释这个问题:printf("%d\n",ara):......
  • js 数组 map方法
    一、map的第一种使用场景需求:我们想得到对象数组中指定的两组或多组key和value值。如下图:下面是一段JSON数据结构{"code":0,"msg":null,"data":[{"processDetailId":1381753495314433,"processId":138175349......
  • 【算法】编写一个函数,返回数字数组的“峰值”(或局部最大值)的位置和值。
    编写一个函数,返回数字数组的“峰值”(或局部最大值)的位置和值。例如,数组arr=[0,1,2,5,1,0]在位置3处具有值为5的峰值(因为arr[3]等于5)。输出将以Dictionary<string,List<int>的形式返回,其中包含两个键值对:“pos”和“peaks”。如果给定的数组中没有峰值,只需返回{“pos”=>newList<int>(),“pea......