arrays - 为什么从未初始化的阵列打印会使我的计算机崩溃?
问题描述
我在 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;
}
解决方案
这是未定义的行为(1),实际上任何事情都可以发生,直到并包括宇宙的早期热寂。
当然,实际计算机蓝屏是非常不寻常的,因此您可能需要考虑它不相关的可能性(当然,除非您可以复制它)。
但是,如前所述,不要做 UB。第一个词是“未定义”是有原因的:-)
(1)作为一个示例,浮点值允许具有陷阱位,这意味着取消引用任意未初始化的变量实际上可能会导致 UB。
如果没有通过标准进行拖钓,可能还有其他情况下 UB 来自您的给定代码。我只是不想为可能永远不会出现的代码这样做:-)
但是,无论如何,即使它不是UB,它仍然是一个坏主意,因为您很可能只是打印出许多任意浮点值。
推荐阅读
- docker - 为什么命令通过正在运行的容器上的“EXEC”指令有效运行,而不是通过 docker-compose?
- python-2.7 - 是否有 Python 函数可以将 unicode 文字转换为可读形式?
- html - 与 photosohp 字体相比,Html 网络字体看起来不同
- javascript - Javascript WebWorker - 异步/等待
- react-native - React Native - 状态改变但组件没有重新渲染
- python - 在 python os.chdir() 中不使用相对路径
- plsql - 无法在游标中获取 dbms_output.put_line
- sql - 如何从 XML 列中提取具有特定数据的值?
- json - 如何拆分这个 json 并在颤动中显示图像?
- sql - 如何在oracle中选择两列,其中一列作为最大值