c/c++语言开发共享这个for循环中发生了什么

我正在尝试别的东西,但突然陷入这种无限循环。 请建议一个答案,并解释下面的循环内容

#include int main() { int x=0; int i; int array[5]; for(i=0;i<=5;i++) { array[i]=x; printf("#%d value set in index %dn",x,i); } return 0; } 

当我在for循环的条件中删除=符号它工作正常。

但是当我把它放到无限循环时,为什么呢? 访问数组中的额外元素(超过其限制)是未定义的行为还是什么? 任何帮助将不胜感激。 提前致谢。

    为了避免像这样容易造成错误,这里有两个很好的规则来编写实际(本地)数组的循环:

    所以,这个循环应该写成:

     for(i = 0; i < sizeof array / sizeof *array; i++) 

    然后你会安全的。

    请注意,这仅适用于sizeof可见大小的“真实”数组,如果您让数组“折叠”成指针则不起作用。

    另请注意, sizeof不是函数,因此在这些情况下,其参数周围不需要() s。

    你将6个整数写入一个空格为5的数组。第6次写入超出了数组的范围,所以它的效果是不可预测的。 在您的情况下,它写入堆栈的下一个sizeof(int)字节。 这是用于循环计数器i的内存,它被重置为0。

    正如您在问题中所说,对此的修复是用<=替换for循环的<=退出条件。

    i==5时,会发生未定义的行为。 array有有效索引0..4 – C中的数组是从0开始的。

    如果将<=替换为< ,则迭代有效索引。

    访问数组中的额外元素(超过其限制)是未定义的行为还是什么?

    是。

    为什么你进入一个无限循环,在这个特定的情况下,实际上很容易理解,看看你的堆栈上的地址:

     int main( ) { int x = 0; int i; int array[5]; printf("&x = %#x, &i = %#x, array = %#x, array+4 = %#xn", &x, &i, array, array+4); 

    printf()的结果将显示变量的地址以及数组的开头和结尾:

     &x = 0xbfac9cec, &i = 0xbfac9ce8, array = 0xbfac9cd4, array+4 = 0xbfac9ce4 

    所以按顺序,你的堆栈看起来像:

      var address *********************** array[0] 0xbfac9cd4 array[1] 0xbfac9cd8 array[2] 0xbfac9cdc array[3] 0xbfac9ce0 array[4] 0xbfac9ce4 i 0xbfac9ce8 x 0xbfac9cec 

    现在你的循环正在写0-5(6个元素),你的数组中只有5个元素,所以写入第6个实际上会覆盖堆栈上的下一个东西,在这种情况下是i 。 这使得这一行:

     array[i]=x; 

    写这个:

     i = x; 

    这将把0(在你的情况下)存储到i,并重新启动循环,所以你将看到它永远循环并打印“0存储到索引0”,然后“索引1”,2,3,4然后重新启动再设置i=x;

    您试图将6个int值存储在大小为5的数组中,这是非法的。

    因此,当您尝试在数组的第6个位置写入时,您将使用x的值(即0)写入变量i 。 现在在下一次迭代中,因为i为0,它小于for循环中指定的条件。 这会导致你的循环一次又一次地运行!

    你的for循环应该从0到4,因为你的数组有5个元素

    需要了解更多c/c++开发分享这个for循环中发生了什么,也可以关注C/ C++技术分享栏目---计算机技术网(www.ctvol.com)!

     #include int main() { int x=0; int i; int array[5]; for(i=0;i<5;i++) { array[i]=x; printf("#%d value set in index %dn",x,i); } return 0; } 

      以上就是c/c++开发分享这个for循环中发生了什么相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/980603.html

      (0)
      上一篇 2021年12月14日
      下一篇 2021年12月14日

      精彩推荐