为什么指向结构的指针会忘记字符串?

时间:2019-04-11 13:27:46

标签: c string pointers struct

在我的主要功能中,我有两个播放器,它们由带有数据的结构表示,包括名称。在另一个源文件中创建指向这些结构的指针时,我无法访问名称字符串,而其余数据很好。

//In pokemonList.c
typedef struct{

    char name[20];
    int level;
    int health;
    int type;
    int type2;


    int fainted;


    int moves[4];

    //stats
    int hp;
    int attack;
    int defense;
    int spAttack;
    int spDefense;
    int speed;

    int attackStage;
    int defenseStage;
    int spAttackStage;
    int spDefenseStage;
    int speedStage;

    int spriteNo;

}Pokemon;

Pokemon summon(Pokemon pokemon, int level){
    pokemon.level = level;
    pokemon.health = (int)((((2.0 * (double)pokemon.hp) + 31.0) * (double)level)/100.0) + (double)level + 10.0;
    pokemon.attack = levelUp(pokemon.attack, pokemon.level);
    pokemon.defense = levelUp(pokemon.defense, pokemon.level);
    return pokemon;
}

//In main.c
player1 = summon(venusaur, 50);
player2 = summon(blastoise, 100);

initialiseGUI(&player1, &player2);

//In video.c

void initialiseGUI(Pokemon *p1, Pokemon *p2){

    strcpy(player1name, p1->name);
    strcpy(player2name, p2->name);
    printf("p1->name: %s\n", p1->name);
    player1 = p1;
    player2 = p2;

    printf("p1->name: %s\nplayer1->name: %s\n", p1->name, player1->name);
}

我希望它的输出是:

p1->name: Venusaur

p1->name: Venusaur

player1->name: Venusaur

实际输出:

p1->name: Venusaur

p1->name:

player1->name:

该结构中的所有其他数据均可从player1->访问。...

1 个答案:

答案 0 :(得分:2)

player1的类型必须为Pokemon,因为它是从返回summon的函数Pokemon中获取其值的。

p1的类型为Pokemon *(又名Pokemon指针)

然后您进行player1 = p1;

换句话说-您将“口袋妖怪指针”分配给无效的“口袋妖怪”。

似乎发生的事情是,您用指针变量覆盖了字符串name的一部分,从而破坏了字符串值。