You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中用循环创建变量以耗尽存储导致系统崩溃?

嘿,作为刚入门C语言的新手,能想到这么有意思的测试方向真的挺棒的!咱们来把你的问题拆解开,一步步说清楚:

首先,你原来的思路为什么行不通?

你想在while(1)循环里反复创建局部变量,但这里有个关键细节:循环体内的局部变量是存在栈内存上的,而每次循环结束后,当前循环的栈帧会被销毁,变量占用的栈空间会被自动释放。

举个例子,你写的代码大概是这样:

#include <stdio.h>

int main() {
    while(1) {
        int temp_var; // 每次循环创建的变量
        // 做点无关的操作
    }
    return 0;
}

这个程序会一直跑下去,但内存占用几乎不会变化——因为每次循环结束,temp_var占用的栈空间就被回收了,下一次循环只是复用了栈里的同一个位置,根本不会累积占用内存,自然也不可能耗尽存储。

那栈内存什么时候会被耗尽?

栈的大小是固定的(Windows默认一般是1MB,Linux通常是8MB左右,具体可以通过系统设置调整),要耗尽栈内存,你需要让栈空间持续叠加而不被释放,比如递归调用:

#include <stdio.h>

void recursive_func() {
    char large_buffer[1024 * 512]; // 每次递归创建512KB的数组
    recursive_func(); // 自己调用自己,栈帧不断叠加
}

int main() {
    recursive_func();
    return 0;
}

这个程序运行后,每次递归都会在栈上新增一个栈帧,很快就会把栈的空间占满,触发「栈溢出」错误(Segmentation Fault),程序会直接崩溃,但这只会让你的进程终止,不会让整个电脑崩溃——现代操作系统会给每个进程分配独立的地址空间,一个进程的崩溃不会影响系统本身。

想耗尽系统内存让电脑崩溃?得用堆内存

你老师提到你没使用堆内存,这恰恰是关键:栈内存太小了,就算耗尽也翻不起大浪。如果想让进程持续占用内存直到系统资源枯竭,得用堆内存(通过malloc/calloc这类函数动态申请):

#include <stdio.h>
#include <stdlib.h>

int main() {
    while(1) {
        // 每次申请10MB的堆内存,不释放
        void* ptr = malloc(1024 * 1024 * 10);
        if (ptr == NULL) {
            printf("内存申请失败\n");
            break;
        }
    }
    return 0;
}

这个程序会不断申请堆内存且不释放,进程的内存占用会越来越高。当系统的物理内存+交换空间都被占满时,系统会变得卡顿,甚至会触发OOM Killer(内存耗尽杀手)自动杀掉你的进程。极端情况下(比如系统没有交换空间,且内存被完全占满)可能会导致系统无响应,但现代操作系统的内存管理机制很完善,一般不会直接崩溃。

最后再总结一下

  • 你最初的while(1)循环创建局部变量的方法,因为栈帧会循环复用,完全无法累积占用内存,不可能耗尽存储。
  • 栈溢出只会让你的程序崩溃,不会影响整个电脑。
  • 用堆内存持续申请不释放,有可能让系统内存耗尽,但现代系统会有保护机制,很难直接让电脑崩溃。

内容的提问来源于stack exchange,提问作者Nick Gr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:33:18