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

C语言编译提示h未初始化 CS50代码偶发运行异常排查

问题诊断

你遇到的编译报错、程序时好时坏的核心原因和代码空格格式没有任何关系,本质是C语言未初始化变量+返回值未接收导致的未定义行为:

  1. 未初始化变量直接触发编译错误,且导致随机运行结果
    你声明int h;时没有给它赋初始值,且do-while循环内调用get_int时,没有将函数返回的用户输入值赋值给h。此时h存储的是栈内存上残留的随机垃圾值:
    • 编译器检测到你在while判断中读取了未赋值的h,直接抛出未初始化错误
    • 如果这块内存的残留值刚好落在1~8区间,循环判断会直接通过,程序看起来“正常运行”;如果残留值不在区间内,要么无限循环要么输出完全错乱。你修改其他代码时会变动栈内存布局,h对应位置的残留值会跟着变化,就会出现“没改动之前调通的代码突然又报错”的情况,这是C语言未定义行为的典型表现。
  2. 你写的get_int("Height: ");只执行了“弹出提示接收用户输入”的逻辑,拿到的输入值直接被丢弃,根本没有存到h变量里。
修复步骤
  • 首先修正do-while循环的赋值逻辑,把用户输入的值存到h中,解决编译报错和随机运行的问题
  • 调整金字塔打印的循环逻辑:你当前写的首段for循环判断条件和分支逻辑存在错误,无法正确输出空格和井号对齐的效果
修正后可运行代码(适配CS50马里奥作业要求)
#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // 获取合法高度值
    int h;
    do
    {
        h = get_int("Height: ");
    } while (h < 1 || h > 8);

    // 逐行打印双金字塔
    for (int y = 0; y < h; y++)
    {
        // 打印每行前置空格
        for (int space = 0; space < h - y - 1; space++)
        {
            printf(" ");
        }
        // 打印左侧井号
        for (int left = 0; left <= y; left++)
        {
            printf("#");
        }
        // 打印中间固定间隔
        printf("  ");
        // 打印右侧井号
        for (int right = 0; right <= y; right++)
        {
            printf("#");
        }
        // 每行结束换行
        printf("\n");
    }
}

如果你只需要解决编译报错不调整打印逻辑,仅把do循环内的get_int("Height: ");修改为h = get_int("Height: ");即可,但原有打印逻辑输出的内容不符合双金字塔的格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:09:29