首页 > 其他分享 >越界访问数组进行赋值时,导致陷入死循环

越界访问数组进行赋值时,导致陷入死循环

时间:2023-04-27 22:04:50浏览次数:35  
标签:arr int 创建 C语言 越界 地址 死循环 赋值

> 选自《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("hello world\n");

    }

    return 0;

}


在vs、x86、C语言环境下运行这串代码,将会死循环地打印hello world。

原因

内存的使用是从高地址到低地址使用的

i先被创建,放在了高地址处

数组在内存中的使用是,下标增大,地址随之增大

arr后创建,放在比i的地址低的位置

在vs、x86、C语言环境下,相邻创建的变量中间会相隔两个整形大小的空间,因为i先创建,并且与arr相邻创建,所以i的地址和arr最后元素的地址+两个整形空间的地址是一样的

当arr进行越界访问时,将会导致越界时触碰到i的地址

当i在循环中被改变时,for循环如果不能被中断,就会死循环

越界访问数组进行赋值时,导致陷入死循环_i++

越界访问数组进行赋值时,导致陷入死循环_i++_02

由上图可知,因为两个变量之间相隔两个整形的大小,所以,arr[12]的地址和i的地址是相同的,当赋值arr[12]=0后,i也会变成0,陷入死循环

标签:arr,int,创建,C语言,越界,地址,死循环,赋值
From: https://blog.51cto.com/u_15992651/6232139

相关文章

  • Java通过反射给final对象赋值(代码库)
    直接赋值会报错Methodthrew'java.lang.UnsupportedOperationException'exception.给没有set方法的类如下赋值publicstaticvoidsetFieldValue(Objectobj,StringfieldName,Objectval){if(isEmpty(obj)||isEmpty(fieldName))return;ClasssuperClas......
  • 解构赋值
    解构赋值是对赋值运算符的扩展。他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。//1、数组解构leta=1,b=2,c=3//console.log(a,b,c)//ES6let[x,y,z]=[1,2,3]......
  • thinkphp在模型中自动完成session赋值示例代码
    相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比如自动验证、自动完成等,今天在开发中遇到自动完成中需要获取session值然后自动赋值的功能,具体看代码;classArticlelModelextendsModel{protected$_auto=array(array('addtime','time',1,'function'......
  • 有符号与无符号数之间赋值的截断和扩展
    长位宽赋值给短位宽的截断问题  对于长给短,无论两个操作数有无符号,直接截断高位,直接赋值;  赋值完成后,左操作数表示的实际数值要根据左操作数有无符号来判定。如果左操作数是无符号数,直接转换为10进制,如果是有符号数,如果最高位不是1,就说明是正数,直接转十进制,如果最高位是1,那......
  • 通过反射获取进行字段赋值
    业务场景背景在以日期维度展示数据时,数据库中保存的数据一般会制作成宽表的形式比如:(id,projectNmae,projectID,indicator_name,indicator_value1,indicator_value1...,day)根据indicator_name获取对应指标,根据indicator_value获取对应周期数据,比如indicator_value1代表(da......
  • bat通过for来实现命令执行结果赋值输出方法
    前提知识点:变量赋值方法:setd=123变量使用方法:echo%d%命令结果赋值不能直接用,只能用for来赋值如:for/F%%iin('time/t')do(sett=%%i)即可将time/t的命令结果赋给变量t结果中如果有空格等分隔符,赋值结果会只为第一段内容,要把结果全赋值,需要加"tokens=\*"如:for/F"t......
  • Java:ArrayList初始化赋值
    测试环境$java-versionjavaversion"1.8.0_251"Java(TM)SERuntimeEnvironment(build1.8.0_251-b08)JavaHotSpot(TM)64-BitServerVM(build25.251-b08,mixedmode)方式一:常规方式List<Integer>list=newArrayList<>();list.add(1);list.add(......
  • 4、复数类赋值
    如题,要求实现:1、复数类含两个参数的构造函数,一个为实部,一个为虚部。2、实现Add()功能,并实现返回值为复数类。3、Show出结果。#include<iostream>usingnamespacestd;classCmycomplex{private:intreal,imag;public:Cmycomplex(intr=0,inti=0);//构造函数......
  • [oeasy]python0135_变量名与下划线_dunder_声明与赋值
    变量定义回忆上次内容变量就是能变的量上次研究了变量标识符的规则第一个字符应该是字母或下划线合法的标识符可以包括大小写字母数字下划线  还研究了字符串(str)的函数isidentifier查询字符串是否为合法标识符 ......
  • 【调试】Valgrind内存泄漏内存越界|运行时间|调用|cache命中率|多线程竞态|堆栈分析..
    目录即看即用详细简介Valgrind工具详解安装使用检测内存泄漏其他内存问题memcheck工具的常用选型其他选项附录其他类似工具实例分析:03.使用未初始化的内存04.使用野指针05.动态内存越界访问06.分配空间后没有释放07.不匹配使用delete或者free08.两次......