添加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
相关产品推荐
相关产品推荐

