计算机内存在这里发生了什么?

时间:2016-04-13 18:45:26

标签: c++

所以我的教授告诉我的班级运行这个程序,它应该显示计算机内存中发生了什么。当我运行它时,我的输出文件与我教授的输出文件具有相同的数字,对于第一行像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;

}

2 个答案:

答案 0 :(得分:10)

a有一个元素。这意味着

for (int i = 0; i < 1000; i++ )
{
    outfile << a[i] << endl;
    //cout << INT_MAX/1000000 +a[i]/1000000 << endl;
    //histogram[  a[i]/1000000 ]++;
}
{p} i >= 1,{p}为undefined behavior。一旦你有未定义的行为,任何事情都可能发生,所以我们不能再推断出发生了什么。

答案 1 :(得分:7)

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

据推测,这是另一个要点的一部分,访问内存越界并不能保证你有任何特定的价值,因此需要相应地初始化你的变量。

但是; 问题是我们认为“访问数组的越界”是未定义的行为。 C ++标准中未定义的行为意味着“编译器可以以其认为合适的任何方式处理这种情况”。大多数编译器将为您提供附近内存位置的值(这很容易),但不要求它们这样做。

同样,一些编译器可以积极地优化未定义的行为(比如在用于索引到i并且适当地调整循环时a永远不会大于1的结论):编译器是免费的假设(出于优化目的)程序员从不调用未定义的行为。有关未定义行为的更多详细信息,请参阅this page from the LLVM project(注意“在野外指针的引用和数据访问之外”,Clang团队和g ++在处理越界错误方面做出了相同的决定:他们访问附近的内存位置;因为这是最简单的事情)。

相关问题