【问题标题】:Array index incrementing limit [closed]数组索引递增限制
【发布时间】:2021-09-30 01:26:23
【问题描述】:

考虑下面给出的代码。让 i = 0 并且数组的大小为 3 并且对于所有三个索引它都满足 while 循环条件。所以在达到 2 的值后我会继续增加吗??

while (A[i] <= 0)
        {
            i++;
        }

【问题讨论】:

  • 是的,变量 i 将增加,导致未定义的行为,因为将访问数组之外​​的内存。
  • @ChrisMM 我会被阻止吗??
  • 这取决于数组后内存中存储的内容。
  • 阅读A[3](如果/当它发生时)是未定义的行为,您需要修复它。请发布minimal reproducible example 而不是代码片段,我们必须在其中猜测变量已初始化的值。
  • @Richard Critten 好的,我下次会注意的。

标签: c++ arrays c


【解决方案1】:

对于所有三个索引,它都满足 while 循环条件。所以在达到 2 的值后我会继续增加吗??

是的,会的。

假设 A[0]、A[1]、A[2] 都小于零,那么i 将增加到值 3,并且您的代码将尝试访问 A[3]。这是非法的 - 超出数组范围 - 并且代码具有未定义的行为。这意味着,我们无法从那里知道会发生什么......程序可能会崩溃。程序可以结束循环。程序可能会将i 增加到4 并尝试访问A[4]...我们无法判断

【讨论】:

  • 所以我可能会超过 3,也可能会停在 3。
  • @Abhinav1036 我们知道它达到 3。之后会发生什么我们不知道。它可能停在 3,它可能停在 4,或者它可能停在 10042……或者程序可能只是崩溃……或者……任何东西……
  • @Abhinav 注意:未定义行为 (UB) 包括在下次代码运行时执行不同的操作。
  • Documentation for Undefined behaviour。如果您不将代码视为计算机运行的指令列表,而是将代码视为您希望程序具有的行为的描述,这会有所帮助。编译器将获取您的描述并生成它可以提出的将产生行为的最佳指令列表。如果代码包含语言没有描述其行为的代码,编译器将不知道要生成什么指令。通常编译器会做它通常会做的事情,在这种情况下继续寻找
【解决方案2】:

C 不会对数组访问进行任何类型的边界检查——它不会抛出任何类型的“IndexOutOfRange”异常或类似的东西。所以,是的,它会不断增加 i 并尝试访问超出数组最后一个元素的内存。

一旦i 大于 3,行为是未定义的,几乎任何结果都是允许的。您的代码可能会彻底崩溃,循环可能会在某个任意索引处停止 ii 可能会溢出,或者可能发生其他事情。

当你编写一个遍历数组的循环时,你必须包含一个条件来防止它迭代到数组的末尾,例如

while( i < N && A[i] <= 0 )
  i++;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2011-11-05
    • 2011-01-01
    相关资源
    最近更新 更多