这里的计算机内存中发生了什么
What is going on in computer memory here?
所以我的教授告诉我的班级运行这个程序,据说它显示了计算机内存中发生的事情。当我运行它时,我的输出文件与教授的输出文件具有相同的数字,首先是 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++在处理越界错误方面做出了相同的决定:它们访问附近的内存位置;因为在这种情况下这是最简单的事情(。
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- 我是否能够确定在部署一个程序后发生了什么,我在数组末尾写入?
- 这个阶乘程序内部发生了什么?
- C++ - *(int**) 地址?这里发生了什么?
- C++用用户输入在循环中填充 char 数组:输入整个字符串时到底发生了什么?
- 让对象知道它创建的 show 函数中发生了什么
- 这里的矢量数组发生了什么?
- 增加顶级常量指针时发生了什么
- 当另一端将其关闭时,插座发生了什么
- C :我堆栈顶部发生了什么
- 此递归中发生了什么?我需要仅使用递归/无循环来计算和备份
- 这个 std::vector 构造函数中发生了什么
- 编译器认为 int 是一个字符串.发生了什么事情
- 无法运行简单的 std::async 和 std::future 测试程序。错误:"has initializer but incomplete type."发生了什么?