C - 结构属性的值在printf之后改变

时间:2016-02-11 09:56:02

标签: c

我最近一直在C中使用RPG,而且我遇到了一个问题。我的程序有很多结构(玩家,暴徒,设备等......),其中一些包含列表。

一切都运转得很好,所以我创建了一个角色并开始打印他的一些属性来测试它们:

Player* playerCharacter = createPlayer("Boby", 10, getRaces(), getItems(), createFirstInventory(), getUsable());

printf("Your helmet is %s\n", playerCharacter->mob->equipment->head->name);
printf("Your helmet is %s\n", playerCharacter->mob->equipment->head->name);

第一个printf工作得很好,但是第二个printf(或之后的任何一个)打印得像一长串随机字符(或数字取决于我尝试打印的内容),而不是头盔的实际名称。 / p>

我一直在想它与内存分配有关(我使用malloc来创建我的列表例如)或者使用“ - >”操作员,但找不到我的问题的答案。

以下是使用的结构声明:

typedef struct Player
{
    int id;
    Mob* mob;
    int lives;
    int gold;
    StuffItem** playerInventory;
    StuffItem** itemsList;
    UsableItem** playerPotions;
    UsableItem** potionsList;
} Player;

typedef struct Mob
{

    int id;
    char* name;
    MobRace* mobRace;
    int hp;
    int attack;
    int relativeDefense;
    int absoluteDefense;
    int dodge;
    Equipment* equipment;
} Mob;

typedef struct Equipment{
    StuffItem* head;
    StuffItem* chest;
    StuffItem* leggings;
    StuffItem* boots;
    StuffItem* leftHand;
    StuffItem* rightHand;
} Equipment;

typedef struct StuffItem
{
    char* name;
    int goldValue;
    // typeId : 0=head, 1=chest, 2=leggings, 3=boots, 4=lefthand, 5=righthand
    int typeId;
    int hp;
    int attack;
    int relativeDefense;
    int absoluteDefense;
} StuffItem;

我的createPlayer功能:

Player* createPlayer(char name[20], int pointsToAttribut, DlistRace* racesList, DlistItems* itemsList, DlistItems* firstInventory, DlistUsable* potionsList)
{
    //Dlist* playerItemList = dlist_new();
    //createItemsList();

    StuffItem* phead = returnListElement(itemsList,0);
    StuffItem* pchest = returnListElement(itemsList,1);
    StuffItem* plegs = returnListElement(itemsList,2);
    StuffItem* pboots = returnListElement(itemsList,3);
    StuffItem* plefthand = returnListElement(itemsList,4);
    StuffItem* prighthand = returnListElement(itemsList,5);

    Equipment* playerEquipment = Equipment_ctor(phead, pchest, plegs, pboots, plefthand, prighthand); 

    Mob* playerMob = Mob_ctor(0, name, returnListElementRace(racesList, 1), 100, 10, 50, 10, 10, playerEquipment);
    Player* playerCharacter = Player_ctor(0, playerMob, 3, 500, firstInventory, itemsList, selectFirstPotions(), potionsList);

    return playerCharacter;

}

提前致谢!

1 个答案:

答案 0 :(得分:3)

  

第一个printf工作正常,但第二个[不]。

这表示您在第createPlayer次呼叫中仍然可用的printf中返回堆栈中的某些数据,并将其放置在printf呼叫的堆栈中,现在被printf电话覆盖。因此,您的数据已被覆盖,第二个printf打印垃圾。

如果您发布CreatePlayer,我们可以查看它。