RPG属性分配函数异常:intel初始值为1而非0的问题排查
问题原因及解决方案
核心问题:变量初始化错误
你在main函数里的变量声明int ref, dex, intel, str = 0;是C语言常见误区——只有最后一个变量str被显式初始化为0,前面的ref、dex、intel都是未初始化的自动变量,它们的初始值是内存中的随机垃圾数据。你看到intel初始值为1只是巧合,换个运行环境可能会是其他随机数,其他变量显示0也是碰巧垃圾值为0而已。
修复步骤
正确初始化所有属性变量
把main里的声明改为每个变量都显式赋值0:int ref = 0, dex = 0, intel = 0, str = 0;修正值传递的问题(额外优化)
当前makechar函数用的是值传递,函数内修改的是参数副本,main里的原始变量不会被更新。如果要让修改后的属性值在main里生效,需要改成指针传递:// 修改函数声明为指针参数 int makechar(int *ref, int *dex, int *intel, int *str); // main中调用时传递变量地址 makechar(&ref, &dex, &intel, &str); // 调整makechar函数内部逻辑为指针操作 int makechar(int *ref, int *dex, int *intel, int *str){ int pointpool = 10; int sel = 0; printf("[BOOTING DEFIB.INC BIOS]\n"); printf("[ERROR FAILED TO LOAD USER STATISTICS.]\n[REQUESTING USER ENTER THEM MANUALLY.]\n[FAILURE TO DO SO WITHIN 7 BUISNESS DAYS WILL RESULT IN TERMINATION OF EMPLOYMENT.]\n[PLEASE CONTACT IT SUPPORT IF YOU HAVE ANY ISSUES COMPLETING THIS TASK.]"); while(pointpool > 0){ // 此处改为>0,避免pointpool为0时仍进入循环多分配一次 printf("Allocate statistic points by inputing the integer that corresponds to the statistic you want to increase. You may only increase your statistics by 10 points:\n"); printf("[1] Reflex = %d\n", *ref); printf("[2] Dexterity = %d\n", *dex); printf("[3] Intelligence = %d\n", *intel); printf("[4] Strength is %d\n", *str); scanf("%d", &sel); switch(sel){ case 1: *ref = *ref + 1; pointpool--; break; case 2: *dex = *dex + 1; pointpool--; break; case 3: *intel = *intel + 1; pointpool--; break; case 4: *str = *str + 1; pointpool--; break; } } return 0; // 函数声明为int类型,需返回对应值 }修正startgame函数的返回错误
startgame声明为void类型,但末尾写了return 1;,这会导致编译错误。要么删除return 1;,要么将函数返回类型改为int并对应调整main中的调用逻辑。
补充说明
- 未初始化的自动变量在C语言中属于未定义行为,值不可预测,必须显式初始化所有需要使用的变量。
- 值传递仅传递变量副本,若需函数修改外部变量,必须使用指针或引用(C++特性)。
内容的提问来源于stack exchange,提问作者Jake Delso
相关产品推荐
相关产品推荐

