这段代码将如何影响内存管理?

时间:2017-03-27 11:59:26

标签: c++

#include<iostream>
using namespace std;
int main()
{
    char  a[]="robert";
    cin>>a;
    cout<<a;
}

因此,a的大小现在固定为7位直观。现在,如果我读到的东西是&#34; qwertyuiop&#34;进入&#39; a&#39;它大于7位,预计会出现溢出。但是没有发生这种情况,它会正常打印输出。这里发生了什么?

2 个答案:

答案 0 :(得分:1)

写出边界是未定义的行为

在这种情况下看起来不错,但如果...

会发生什么
#include<iostream>
using namespace std;
int main()
{
    char  a[5];
    char  b[7];
    cin >> a;
    cin >> b;
    cout << a << endl;
}

输入:

  

金刚
  monkeyhunter

输出:

  

kingkmonkeyhunter

他们混在一起!

你应该小心C ++中的数组,如果你试图写出界限,它可能没有可见的效果。

答案 1 :(得分:0)

操作系统(在处理器的帮助下)定义了允许应用程序读/写的内存区域。当您在外面阅读预期内容时,处理器会触发操作系统捕获的硬件异常,这会触发您的应用程序终止。

但是,在数组外部读取不一定在应用程序的边界之外读取(例如,您可以写入/读取自己代码的另一个变量)。例如,在内存区域的末尾,您通常以相反的顺序拥有程序堆栈。

C ++将数组范围之外的读/写指定为未定义行为。在这种情况下,它可能会以“随机”的方式崩溃或不崩溃。