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

C语言结构体传参及分数交换函数编译报错求助

C语言结构体分数交换函数的错误修正

原代码中的核心问题:

  • 结构体定义顺序错误:函数声明时struct HighestScore还未定义,C语言要求使用结构体前必须先完成定义。
  • 函数声明与定义不匹配:声明的参数是结构体值传递,实际定义的是指针传递,两者类型不一致。
  • 大小写敏感问题:结构体成员定义的是Score(大写S),但代码中多处写成score(小写s);函数参数名Player/CurrentPlayer在函数内被写成小写的player/currentPlayer,C语言区分大小写,会导致未定义标识符错误。
  • 结构体指针访问成员错误:指针类型的结构体变量需要用->访问成员,而非.。
  • 交换逻辑错误:原代码错误地将结构体指针赋值给int类型成员,且未正确实现分数交换逻辑。

修正后的完整代码:

#include <stdio.h>

// 先定义结构体,再声明函数
struct HighestScore
{
    char name[20];
    int Score;
};

// 函数声明与定义保持一致,使用指针传递
void SwapScore(struct HighestScore *Player, struct HighestScore *CurrentPlayer);

int main()
{
    struct HighestScore Player;
    struct HighestScore CurrentPlayer;

    printf("Enter your first name: ");
    // name是数组名,本身就是地址,不需要加&
    scanf("%s", CurrentPlayer.name);
    Player.Score = 1000000000;
    CurrentPlayer.Score = 10;
    
    // 传递结构体变量的地址给指针参数
    SwapScore(&Player, &CurrentPlayer);

    // 打印验证交换结果
    printf("Player's score: %d\n", Player.Score);
    printf("CurrentPlayer's score: %d\n", CurrentPlayer.Score);

    return 0;
}

void SwapScore(struct HighestScore *Player, struct HighestScore *CurrentPlayer)
{
    // 临时存储其中一个分数
    int temp = Player->Score;
    // 交换两个结构体的Score成员
    Player->Score = CurrentPlayer->Score;
    CurrentPlayer->Score = temp;
}

额外说明:

  • scanf("%s", CurrentPlayer.name)中,name是数组首地址,不需要加&,原代码的&CurrentPlayer.name属于冗余写法。
  • 使用指针传递结构体是因为如果传值的话,函数只会操作结构体的副本,无法修改原变量的值,这也是实现原变量分数交换的核心要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:32:13