【问题标题】:Why is there an infinite loop in my program?为什么我的程序中有无限循环?
【发布时间】:2012-12-10 19:40:58
【问题描述】:
int main(void)
{
    int i;
    int array[5];

    for (i = 0; i <= 20; i++)
    array[i] = 0;

    return 0;
}

为什么上面的代码会陷入死循环?

【问题讨论】:

  • 堆栈涂鸦...但是恭喜!你编写了一个 5 行程序,什么都不做,却运行了很长时间!
  • 投反对票 - 当问题写得不好或不遵守网站规则时使用投反对票,而不是针对琐碎的问题!
  • 这个问题可能重复..stackoverflow.com/questions/13010004/…

标签: c arrays for-loop infinite-loop


【解决方案1】:

您声明了一个包含 5 个元素的数组,但向其中写入了 21 个元素。写入数组末尾会导致未定义的行为。在您的情况下,您正在写入循环计数器 i,将其重置为 0,可能是在您分配 array[5] 时。

如果要修复程序,请更改循环以写入正确数量的元素

int num_elems = sizeof(array) / sizeof(array[0]);
for (i = 0; i < num_elems ; i++)

【讨论】:

    【解决方案2】:

    您通过覆盖超出您允许的内存来调用未定义的行为。所以任何事情都有可能发生。

    很可能,它正在覆盖循环计数器。

    【讨论】:

      【解决方案3】:

      问题是当您尝试访问数组边界之外的元素时,该元素只有 5 大 - 但在一个 21 大的循环中。

      int main(void)
      {
          int i;
          int array[5];
      
          for (i = 0; i < 5; i++)
          array[i] = 0;
      
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        我没有看到任何无限循环条件,但您在一个具有 5 个“槽”的数组上设置了多达 20 个值???

        【讨论】:

          【解决方案5】:

          这是给定代码中发生的事情。

          #include<stdio.h>
          #include<string.h>
          int main(void)
          {
              int i;
              int array[5];
          
              for (i = 0; i <= 20; i++)
              {
                  printf("%p %p \n",&i,&array[i]);
                  printf("the value of i is %d \n",i);
                  sleep(1);
                  array[i] = 0;
                  printf("i may be modified here lets see what i is %d \n", i);
              }
          
              return 0;
          }
          

          在我的堆栈内存中,地址位置为

          i 存储在位置 0xbfd1048c 地址

          array存储在地址0xbfd10478地址

          当您在某个时间点为每个循环增加 i 值时,array[i] 的地址等同于 i 的地址(它只是指针解引用)

          所以你在array[i] 存储的只是i 的实例地址,所以你把i 的实例值写成0,正如你提到的array[i] = 0 相当于@ 987654331@ 所以条件i&lt;=20 总是成功。

          现在有个大问题,为什么要以这种方式分配内存。

          这是在运行时和内核资源的可用性决定的。

          所以这就是为什么我们必须忍受数组的限制。

          【讨论】:

          • 地址的示例代码和日志记录是一个很好的答案方法。一个小点 - 堆栈上项目之间的偏移量是在编译时确定的,而不是在运行时。
          • 栈帧的布局(i和array都在栈上)由编译器决定
          猜你喜欢
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多