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

C语言结构体exp自动计算异常求助:输出值与预期不符

问题分析与解决方案

你的代码存在两个核心问题:

  1. 结构体typedef语法错误:原代码中typedef struct stats { ... };未指定结构体别名,标准C中无法直接用stats enemy;声明变量(部分编译器可能兼容,但属于不规范写法)。
  2. 结构体成员初始化逻辑错误:C语言不允许在结构体定义时,用其他成员变量计算当前成员的初始值。此时health和armor尚未分配内存、无有效值,exp会被初始化为随机垃圾值,也就是你看到的13743895。

修正方案1:用函数手动计算经验值

先修正结构体定义,再通过函数实现经验值的自动计算:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

// 修正typedef语法,添加结构体别名
typedef struct stats
{
    int health;
    int armor;
    int exp;
} stats;

// 计算并更新经验值的函数
void update_enemy_exp(stats *enemy) {
    enemy->exp = (enemy->health * enemy->armor) / 50;
}

int main()
{
    stats enemy;
    enemy.health = 10;
    enemy.armor = 10;
    // 设置属性后调用计算函数
    update_enemy_exp(&enemy);
    printf("%i\n", enemy.exp); // 输出预期值2
    return 0;
}

修正方案2:用构造函数风格函数初始化敌人

如果需要一次性创建并初始化敌人角色,可以写一个封装初始化逻辑的函数:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct stats
{
    int health;
    int armor;
    int exp;
} stats;

// 传入生命值和护甲值,返回初始化完成的敌人结构体
stats create_enemy(int health, int armor) {
    stats new_enemy;
    new_enemy.health = health;
    new_enemy.armor = armor;
    new_enemy.exp = (health * armor) / 50;
    return new_enemy;
}

int main()
{
    // 直接创建初始化好的敌人
    stats enemy = create_enemy(10, 10);
    printf("%i\n", enemy.exp); // 输出预期值2
    return 0;
}

补充说明

如果你的编译器支持C11及以上标准,也可以用匿名结构体初始化+复合字面量的方式简化,但上述两种方案兼容性更强,更符合C语言的常规编码习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:10:16