这里的计算机内存中发生了什么

What is going on in computer memory here?

本文关键字:发生了 什么 内存 计算机 这里      更新时间:2023-10-16

所以我的教授告诉我的班级运行这个程序,据说它显示了计算机内存中发生的事情。当我运行它时,我的输出文件与教授的输出文件具有相同的数字,首先是 4 行,然后从那时起完全不同的数字。但这似乎不像是在拉随机数,因为很多输出都是 0,很多是长度相似的大量输出。谁能解释一下?

#include <iostream>
#include <fstream>  // for files
#include <cstdlib>   // for exit
#include <climits> // for INT_MAX etc.
int main( )
{
using namespace std;
ofstream outfile;
outfile.open("Whats_in_computer_memory.txt");
cout << "In this program, we declare a small array and then use array syntax " << endl
     << "to see what is in the computer's memory. " << endl
     << " " << endl
     << " " << endl
     << " " << endl
     << " " << endl
     << " " << endl;
int a[1];
int histogram[214749];
for (int i = 0; i < 214749; i++ )
{
    histogram[i] = 0;
}
cout << "&a[0] = " << &a[0] << endl
     << "&histogram[0] = " << &histogram[0]<< endl
     << " " << endl;
cout << INT_MAX << endl;
for (int i = 0; i < 1000; i++ )
{
    outfile << a[i] << endl;
    //cout << INT_MAX/1000000 +a[i]/1000000 << endl;
    //histogram[  a[i]/1000000 ]++;
}
for (int i = 0; i < 2 ; i++ )
{
    cout << histogram[ i ] << endl;
}

char dummy;
cin >> dummy;
return 0;

}

a有一个元素。 这意味着

for (int i = 0; i < 1000; i++ )
{
    outfile << a[i] << endl;
    //cout << INT_MAX/1000000 +a[i]/1000000 << endl;
    //histogram[  a[i]/1000000 ]++;
}

一旦i >= 1就未定义的行为。 一旦你有未定义的行为,任何事情都可能发生,所以我们无法再推理正在发生的事情。

你的教授试图证明你的程序周围的内存区域包含"东西" - 特别是你的程序周围的内存不是零或设置为任何其他默认值。

据推测,这是进一步的观点的一部分,即越界访问内存并不能保证您将具有任何特定值,因此需要相应地初始化变量。

然而,问题在于我们认为"访问数组的越界"是未定义的行为。C++标准中的未定义行为意味着"编译器可以以它认为合适的任何方式处理这种情况"。大多数编译器会从附近的内存位置为您提供值(这很容易做到(,但它们不是必需的。

同样,一些编译器可以积极地优化未定义的行为(例如得出结论,当用于索引a时,i永远不会大于 1,并适当地调整循环(:编译器可以自由地假设(出于优化目的(程序员永远不会调用未定义的行为。有关未定义行为的更多详细信息,请参阅LLVM项目的此页面(请注意,在"取消引用野生指针和越界数组访问"下,Clang团队和g++在处理越界错误方面做出了相同的决定:它们访问附近的内存位置;因为在这种情况下这是最简单的事情(。