当前位置: 首页 > 知识库问答 >
问题:

为什么从未初始化的阵列打印会使我的计算机崩溃?[副本]

孙财
2023-03-14

我在windows 10上运行cygwin。我在摆弄一些C语言,运行了这段代码很多次。我的笔记本电脑没有反应,几秒钟后,我得到了一个蓝屏,不得不重新启动。问题是,我所做的只是从内存中读取并打印到stdout,这不应该导致这种情况。我检查了一下,数组大小没有超过cygwin的最大堆栈大小。

#include <stdio.h>


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

共有1个答案

杨良才
2023-03-14

这是一种未定义的行为,(1),从字面上说,任何事情都是允许发生的,直到并包括宇宙的早期热死亡。

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

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

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

除了浏览标准之外,可能还有其他UB来自于给定代码的情况。我只是不想为那些可能永远也不会公开的代码这么做:-)

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

 类似资料:
  • 为什么打印(或其他一些随机数)?什么是 printing?为什么它不是 (或 )?

  • 我使用CameraX用例在屏幕上显示来自摄像头的图像,同时对其执行对象检测。下面是与CameraX相关的代码,位于我的主要活动的onCreate()函数中。 尽管如此,我在一些(比如说1/5)应用程序初始化时遇到了一个错误,在工作和非工作情况之间没有任何代码或二进制修改: 如果我尝试不访问previewView.display以避免崩溃,我只是得到空裁剪的图像,直到我重新启动应用程序。 它似乎与视

  • 有人能解释一下为什么TestClass构造函数没有被调用吗?如果我创建另一个类,但不使用包含main方法的类,它就能工作?

  • 我已经签署了一个应用程序与我创建的标志。我已经在我的手机里安装了这个apk,这是可以的,但是当我尝试打开应用程序时,它崩溃了(没有显示任何活动),并且它没有给我看日志的机会(这个对话框没有报告按钮) 问题是我在应用程序上的签名。我已经测试了其他标志和应用程序打开完美。我不能发布任何关于创建标志的信息,但只有我可以说我使用了: 其他字段为空。 主要的问题是这个应用程序是在google play中发布

  • 我想知道为什么输出值0。我认为如果一个变量没有初始化,它会输出一个垃圾值。 但是,我还记得听到整数的默认值为0,所以我有点困惑。 谢谢

  • 这将打印出r1 r4 pre b1 b2 r3 r2 hawk 但我不明白为什么它打印r3 r2而不是r2 r3,这似乎是倒退的。如果初始化块是自上而下执行的,为什么它从底部语句r3开始,到R2结束呢?在超类Bird中,它的执行方式与我预期的b1和b2一样,从上到下,但在超类Raptor中,在构造函数运行之后,控件似乎首先跳转到最后一条语句,并将自己工作回顶部。有什么想法吗? 快把我逼疯了。