-2

我在 C++ 中编写了这样的代码:

int main() {
    int myArray[5];
    int n =1;
#define EVER ;;
    for(EVER){
       myArray[n] +=n++;
    }
    return 0;
}

我让它运行,我得到一个蓝屏。在此之后我的电脑不想启动。我做错了什么?我是 C++ 新手。谢谢

4

2 回答 2

5

由于程序如此之小,您的程序充满了令人印象深刻的未定义行为。未定义的行为意味着程序的行为是不可确定的,就 C++ 标准而言。换句话说,就 C++ 标准而言,任何事情都可能发生。

int myArray[5];

在此语句中,您保留了myArray未初始化的值。虽然这本身并不是未定义的行为,但是当您在写入这些值之前尝试读取这些值时,您会这样做。

myArray[n] += n++;

该语句本身,没有其他上下文,是未定义的行为。没有指定是先评估ninmyArray[n]还是先评估in n++。换句话说,这两个表达式相对于彼此是无序的。一个是读取 的值n,另一个是修改它。读取变量的值并在没有干预序列点的情况下对其进行修改是未定义的行为。

最后,假设上面的代码以您期望的方式运行,您将永远循环,不断增加 n。一旦 n 达到 5,您就不再有权读取或写入myArray. 一旦 n 达到 6,您就不再有权引用这些位置。这样做是更多未定义的行为。

我描述的前两个问题虽然很糟糕,但实际上它们很可能不会导致您所看到的那种行为(至少不会由它们自己引起)。第三个,写入数组末尾之外的内存位置,这很可能是您看到的主要错误的罪魁祸首。

于 2013-04-15T18:25:51.453 回答
1

这个版本可以正常工作。它将填充数组,但不会填充所有计算机内存。

int main()
{
  int myArray[5];

  for(int n = 1;;++n)
    myArray[n % 5] = n;
}
于 2013-04-15T18:56:25.140 回答