首页 > 解决方案 > 为什么从未初始化的阵列打印会使我的计算机崩溃?

问题描述

我在 Windows 10 上运行 cygwin。我在搞乱一些 C++ 并多次运行这段代码。我的笔记本电脑没有响应,几秒钟后,我出现蓝屏,不得不重新启动。问题是,我所做的只是从内存中读取并打印到标准输出,这不应该导致这种情况。我检查了一下,数组大小没有超过 cygwin 的最大堆栈大小。

#include <stdio.h>


int main (){
    double a[6675];
    int i = 0;
    while (i<6675){
        printf("%f\n", a[i]);
        ++i;
    }
return 0;
}

标签: arraysc++11stdio

解决方案


这是未定义的行为(1),实际上任何事情都可以发生,直到并包括宇宙的早期热寂。

当然,实际计算机蓝屏是非常不寻常的,因此您可能需要考虑它不相关的可能性(当然,除非您可以复制它)。

但是,如前所述,不要做 UB。第一个词是“未定义”是有原因的:-)


(1)作为一个示例,浮点值允许具有陷阱位,这意味着取消引用任意未初始化的变量实际上可能会导致 UB。

如果没有通过标准进行拖钓,可能还有其他情况下 UB 来自您的给定代码。我只是不想为可能永远不会出现的代码这样做:-)

但是,无论如何,即使它不是UB,它仍然是一个坏主意,因为您很可能只是打印出许多任意浮点值。


推荐阅读