gpt4 book ai didi

c - 数组中的下标超出范围

转载 作者:行者123 更新时间:2023-11-30 21:47:49 25 4
gpt4 key购买 nike

此处数组的下标超出范围。

 int a[10], i;
for (i = 1; i <= 10; i++)
a[i] = 0;
printf("India");

输出是一个无限循环,并且 printf 语句不会被执行。这是 K N King 中写的内容:

当 i 达到 10 时,程序将 0 存储到 [10] 中。但 [10] 并不存在。所以 0 在 [9] 之后立即进入内存。如果变量 i 恰好跟随a [9] 在内存中(可能是这种情况),然后 i 将被重置为 O。循环重新开始。

谁能解释一下吗?

最佳答案

这将形成无限循环的想法是基于关于变量如何在内存中布局的假设。特别是,它假设因为 i紧接在a之后定义 ,它也将在 a 之后立即分配到内存中。 .

这当然不能保证,但同样肯定会发生。如果是,则写入 a[10]实际上可能会覆盖i 。既然正在写0进入不存在的a[10] ,这样做实际上会写 0进入i 。然后,当循环中的条件检查 i <= 10 时,确实如此,因此循环继续 - 每次 i达到 10 时,在评估循环条件之前,它会立即被 0 覆盖,因此循环会从头开始。

就 C 或 C++ 标准而言,这只是未定义的行为 - 当代码写入超过数组末尾时任何事情都可能发生。它可能会做某些人期望的事情,或者可能会做一些完全不同且不相关、似乎根本没有意义的事情。在这种情况下,编译器可以自由地发出几乎可以执行任何操作的代码(或者,例如,它可以将其诊断为错误,并且根本不发出任何代码)。

给出一些关于什么是符合行为的想法:gcc 的早期版本有代码来检测实现定义的行为的特定情况(非常类似于未定义的行为,除了实现必须记录它能做什么)。在这种情况下,记录的行为相当复杂。编译器将尝试按顺序执行以下每项操作(并在第一个成功的操作处停止):

  1. 运行 nethack(游戏)
  2. run rogue(另一款游戏)
  3. 启动 emacs,并让它执行汉诺塔模拟
  4. 打印出“你正处于一个由曲折的小 channel 组成的迷宫中,所有的 channel 都是相似的”。

我的顺序可能有点错误(这是很久以前的事了),但你明白了。结果与一个理性的人可能期望的任何事情都没有关系。

关于c - 数组中的下标超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26144951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com