为什么与普通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?
我发现这种情况很有趣,让我解释一下:
当我初始化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
中的数组元素读取的未定义值与后来在循环中读取的内容。显然,它不会试图展开循环 - 之后,它将知道如何优化读取。
在任何情况下,每当您访问非初始化的值时,该值是未定义的,它可能是任何东西,包括零(即使您尚未调用未定义的行为)。每当您使用这种值进行内存访问(非初始化的指针等)时,您的行为不确定。
相关文章:
- 如何循环访问常量字符**?
- 如何在 c++ 中仅循环访问特定列?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- C++ - 循环访问指针数组会导致错误
- 视觉 如何循环访问C++中遵循类似格式的多个.txt文件?
- 如何在C++中循环访问未知对象方法?
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 在C++中循环访问自定义结构列表的小问题
- 有没有办法在C++中循环访问对象的不同数据成员
- 循环访问还包含未使用元素的字符串数组
- Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- 循环访问资源字符串表
- 在C++中循环访问类继承
- c++ 循环访问对象列表并删除对象
- 循环访问自定义双链表
- 循环访问对象列表 c++
- C++ 访问 if 语句(如果它们在 for 循环中)
- 从文件读取,并循环访问文件以写入数组
- 当我用"ñ"字符循环访问字符串时出现奇怪的结果
- 如何访问循环中结构的成员