C程序获取输入后无法输出avgHits结果的问题求助
问题修复:C程序无输出avgHits的问题
核心问题分析
你的程序输入完成后无输出,本质是内存越界导致的未定义行为,加上一处循环逻辑错误:
- 变长数组(VLA)初始化时机错误:定义
hitDiceResults[hitSimulations]、woundDiceResults[successfulHits]、saveDiceResults[successfulWounds]时,这些变量初始值都是0,数组长度为0,后续对数组的赋值操作直接越界,破坏内存结构,导致程序崩溃或卡死。 - 循环边界错误:统计save骰子结果的循环中,循环条件写成了
k < successfulHits,但saveDiceResults的长度是successfulWounds,越界访问会引发内存异常。 - 整数除法精度丢失:
avgHits = successfulHits / simulations是整数除法,结果会被截断,无法得到正确的浮点平均值。
修复步骤
- 调整变长数组定义位置:将所有依赖输入值的数组定义,移到对应变量赋值完成之后:
- 在计算
hitSimulations = simulations * attacks;之后,定义hitDiceResults - 在计算出
successfulHits之后,定义woundDiceResults - 在计算出
successfulWounds之后,定义saveDiceResults
- 在计算
- 修正循环边界:将统计save结果的循环条件改为
k < successfulWounds - 修正整数除法:强制将其中一个操作数转为浮点型,确保除法结果为浮点数:
avgHits = (double)successfulHits / simulations;
修复后的关键代码片段
// ... 前面的输入和计算逻辑保持不变 // Determines how many attacks are done and multiples that by simulations attacks *= attackingUnitSize; hitSimulations = simulations * attacks; // 移到此处定义hitDiceResults,此时hitSimulations已有正确值 int hitDiceResults[hitSimulations]; int i, j, k; for (i = 0; i < hitSimulations; i++){ dice = rand() % 6 + 1; hitDiceResults[i] = dice; } // ... 中间的hit统计逻辑保持不变 // Tallies up successful hits if (skill == 1){ successfulHits = hitOnes + hitTwos + hitThrees + hitFours + hitFives + hitSixes; } // ... 其他skill判断保持不变 // 移到此处定义woundDiceResults,此时successfulHits已有正确值 int woundDiceResults[successfulHits]; //rolls dice for wounds after successful hits for(j = 0; j < successfulHits; j++){ dice = rand() % 6 + 1; woundDiceResults[j] = dice; } // ... 中间的wound统计逻辑保持不变 //tallies up the successful wound rolls if (woundRoll == 1){ successfulWounds = woundOnes + woundTwos + woundThrees + woundFours + woundFives + woundSixes; } // ... 其他woundRoll判断保持不变 // 移到此处定义saveDiceResults,此时successfulWounds已有正确值 int saveDiceResults[successfulWounds]; //rolls dice equal to the number of successfulwounds for (k = 0; k < successfulWounds; k++){ dice = rand() % 6 + 1; saveDiceResults[k] = dice; } // 修正循环条件为successfulWounds for(k = 0; k < successfulWounds; k++){ if (saveDiceResults[k] == 1){ saveOnes += 1; } // ... 其他save判断保持不变 } // ... 后续save统计逻辑保持不变 // 修正整数除法为浮点除法 avgHits = (double)successfulHits / simulations; printf("Average number of hits across %d simulations ", simulations); printf(" is: %f.\n", avgHits); return 0;
内容的提问来源于stack exchange,提问作者AnoXicz
相关产品推荐
相关产品推荐

