为什么与普通cout的行为相比,C 中的for循环访问非初始化的内存位置

Why does a for loop in c++ access a memory location in non-initialized compared to the behavior of a normal cout?

本文关键字:访问 循环 for 中的 位置 内存 初始化 cout 为什么      更新时间:2023-10-16

我发现这种情况很有趣,让我解释一下:

当我初始化INT数组时,我开始怀疑C 如何处理无初始化值的索引。当直接使用 cout 时,C 直接输出值为0。但是,在此之后插入for loop时,以相同的目的指向内存位置内的值,并假装它们不是初始化。

要重新生成此错误,请复制&将代码粘贴到编译器上。在没有for循环的情况下运行一次,然后使用for循环。

我只是想知道为什么会发生这种情况。


#include <iostream>
using namespace std;
int main() {
    int myArray[4];
    myArray[2] = 32;
    cout << "n Val 1: "<< myArray[0] << "n Val 2: "<< myArray[1]<< "n Val 3: "<< myArray[2]<< "n Val 4: "<< myArray[3]<< "n Val 5: "<< myArray[4];
    cout <<"n ----------------------------";
    /*
    for(int i = 0; i < 5; i++){
        cout << "n Val " << i << ": " << myArray[i];
    }
    */
    return 0;
}

您可能正在见证(聪明)优化器的工作:

如果没有for循环,则可以使用固定常数访问数组元素,而常数可以轻松地启用该元素,而该元素可以轻松地将其导致非初始化的值,这也永远不会再使用。因此,它可以优化消除实际上从非初始化的内存中读取元素,因为它完全有权使用一些常数。

使用 for循环,您有第二次使用值(通过使用动态索引),并且优化器必须确保您从第一个cout中的数组元素读取的未定义值与后来在循环中读取的内容。显然,它不会试图展开循环 - 之后,它将知道如何优化读取。

在任何情况下,每当您访问非初始化的值时,该值是未定义的,它可能是任何东西,包括零(即使您尚未调用未定义的行为)。每当您使用这种值进行内存访问(非初始化的指针等)时,您的行为不确定。