数组越界:数组越界就如同闯红灯,一旦出问题,

 2021-07-10 16:22    77  

老张数组越界:小豆丁!快回来,不要闯红灯!

数组越界:数组越界就如同闯红灯,一旦出问题,后果很严重

小豆丁数组越界:额...现在又没有车...

老张:没有车那也不行数组越界!知不知道闯红灯是很危险的事情!

小豆丁:哦...

老张:这是规矩,是我们应该遵守的。不要以为没有车辆经过就可以闯红灯了,闯一次没事,闯两次没事,可是一旦出事!那就一定是个大事!可能这辈子你都不会再有机会闯红灯了!

小豆丁:老张...你不要吓我...我知道错了...以后不会了...

老张:其实不仅仅在我们的生活中有些规矩要遵守,在我们写代码的过程中,有些问题也不能逾越,这些都是相通的。

小豆丁:哦?代码中也有不能逾越的规矩?是什么呀?

老张:比如说,数组越界!

小豆丁:什么是数组越界啊?

老张:就是超出数组的下标范围进行元素使用。

小豆丁:有点迷糊,具体说说呗!

老张:好,那我先问问你,下面这行代码啥意思?

int arr[4] = {1,2,3,4};

小豆丁:这个难不倒我!这行代码表示声明了一个叫做arr的数组,数组有四个元素,每个元素都是整数类型的,四个元素的值分别是1,2,3,4!

老张:嗯,说的不错,那我在问问你,这四个元素分别怎么表示啊?

小豆丁:想要表示这几个元素,需要通过数组下标的方式,这四个元素表示起来应该是这个样子:arr[0]、arr[1]、arr[2]、arr[3]。

老张:那这四个元素在内存分布上有什么特点啊?

小豆丁:它们每个元素在内存中都是占四个字节,并且在内存中是连续排列存在的,一个挨着一个的。

老张:说得对,那我再问你,arr[4]表示啥意思呢?

小豆丁:额...这个表示应该有问题吧,这个数组一共就是四个元素啊,最后一个元素的下标应该是3啊,arr[4]这种写法应该会报错吧!

老张:确定会报错吗?

小豆丁:额...我不知道了...

老张:其实这种写法不会报错,并且你能顺利的给下标为4的这个元素赋值!

小豆丁:为什么?这么神奇吗?明明数组中不包含这个元素啊!

老张:这就是数组越界问题!我们所列举的案例中,数组arr一共只有四个元素,下标从0开始,到3结束,而且在数组声明并初始化的时候,我们会在内存中占用连续的4*4个字节,这16个字节归数组的4个元素所使用,以后程序中声明的其他变量也不会占用这里,你可以理解成这四个元素所占用的16个字节是合法的,有正规手续的。而arr[4]这种写法并不会报错,它表示的是数组元素arr[3]之后紧邻的四个字节存储区。如下图。

但是这四个字节的存储区并不是合法的,它不在我们合法分配的16字节之,我们使用arr[4]这个元素相当于我们在非法使用权限范围之外的存储空间。那么这块存储空间原本存储的数据是什么我们不知道,可能有用,也可能没用。我们在给arr[4]这个元素赋值时,会对这块存储区里原本的数据进行覆盖。万一这里存储的是有用的数据,造成的后果可能不堪设想!

小豆丁:哦,我懂了,这就是数组越界啊,就是超出数组下标范围去使用非法的存储区了。

老张:没错,就是这个意思,数组越界使用存储区,如果这块存储区被占用,有重要的数据,那么整个程序的运行结果可能会错误,甚至整个程序都可能崩溃。就像我们过马路一样,不要抱着侥幸的心理去闯红灯,一旦出现意外,后果可能很严重!

小豆丁:老张,我知道了,以后一定会注意的!

老张:其实生活和编程有很多相通的地方,生活懂了,悟了,编程也就通了,顺了!

本文标签:数组

原文链接:https://www.xgfox.com/jsyd/776.html

本文版权:如无特别标注,本站文章均为原创。