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

RPG属性分配函数异常:intel初始值为1而非0的问题排查

问题原因及解决方案

核心问题:变量初始化错误

你在main函数里的变量声明int ref, dex, intel, str = 0;是C语言常见误区——只有最后一个变量str被显式初始化为0,前面的ref、dex、intel都是未初始化的自动变量,它们的初始值是内存中的随机垃圾数据。你看到intel初始值为1只是巧合,换个运行环境可能会是其他随机数,其他变量显示0也是碰巧垃圾值为0而已。

修复步骤

  1. 正确初始化所有属性变量
    把main里的声明改为每个变量都显式赋值0:

    int ref = 0, dex = 0, intel = 0, str = 0;
    
  2. 修正值传递的问题(额外优化)
    当前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类型,需返回对应值
    }
    
  3. 修正startgame函数的返回错误
    startgame声明为void类型,但末尾写了return 1;,这会导致编译错误。要么删除return 1;,要么将函数返回类型改为int并对应调整main中的调用逻辑。

补充说明

  • 未初始化的自动变量在C语言中属于未定义行为,值不可预测,必须显式初始化所有需要使用的变量。
  • 值传递仅传递变量副本,若需函数修改外部变量,必须使用指针或引用(C++特性)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:02:53