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

添加void函数printInstructions后C程序崩溃,单独运行playGame正常,求排查

C程序崩溃问题排查与修复

崩溃根源

你的程序崩溃的直接原因是**playGame函数中未初始化变量j导致数组越界访问**,这属于C语言中的未定义行为:

  • 你声明了int j;但未赋值,它的值是栈上的随机垃圾数据
  • 循环中直接用dice[j]访问数组,当垃圾值超出dice数组合法索引范围(0-99)时,会破坏栈内存结构,触发程序崩溃

为什么单独调用playGame时看似正常?

这是未定义行为的典型表现:栈上的垃圾值刚好落在dice数组的合法索引范围内,所以没有触发内存错误,但这完全是偶然情况,程序本身存在严重隐患。

调用printInstructions后崩溃的原因

printInstructions函数执行时会占用栈空间并修改栈上数据,导致playGame函数中j的垃圾值变成了超出数组范围的索引,此时访问dice[j]就会直接触发内存访问错误,程序崩溃。

修复方案

1. 修正数组下标变量

循环逻辑中应该用循环变量i作为数组下标,替换未初始化的j:

int playGame()
{
    int dice[100];
    int diceAmount, sum = 0; // 移除未使用的j
    
    printf("How many dice would you like to roll? ");
    scanf("%d",&diceAmount);
    
    for( int i = 0; i < diceAmount; i++)
    {
        dice[i] = rand() % 6 + 1; // 用i作为下标
        sum += dice[i];
        printf("Dice %d: %d\n",i+1,dice[i]);
    } 
    printf("---------\nSum: %d\n", sum);
    return sum; // 补上int类型函数的返回值
}

2. 补充其他细节

  • playGame声明为int类型,但原代码没有返回语句,需要添加return sum;(或根据需求改成void类型)
  • 建议在main函数开头添加srand(time(NULL));,避免每次运行生成相同的随机数序列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:10:25