2016-02-11 3 views
-2

Недавно я работал над RPG в C, и я столкнулся с проблемой. Моя программа имеет кучу структур (плеер, моб, оборудование и т. Д.), Некоторые из которых содержат списки.C - Значения атрибутов структур меняются после печати

Все работает просто отлично, так что я создал персонажа и начал печатать некоторые из его атрибутов, чтобы проверить их:

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 работает просто отлично, но второй один (или больше после это) печатает как длинный список случайных символов (или цифр в зависимости от того, что я пытаюсь напечатать) вместо фактического имени шлема.

Я думал, что это связано с распределением памяти (я использую 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; 

} 

Заранее спасибо!

+2

Не могли бы вы добавить разделение ваших структур playerCharacter, mob, equipment, head и name? Интересуют функции, вызываемые в 1-й строке. – Coconop

+1

_Первый printf работает отлично, но второй ..._ Эти инструкции идентичны и последовательны. Опубликуйте компилируемый код, который дает ошибку, о которой вы спрашиваете. Взгляните на [MCVE] (http://stackoverflow.com/help/mcve) – LPs

+1

Мое предположение? createPlayer() возвращает указатель на локальный стек var, т.е. UB. –

ответ

3

Первый printf работает просто отлично, но второй [нет].

Это свидетельствует о вас возвращении некоторых данных, которые в стеке в вашем createPlayer который в первом printf вызова по-прежнему доступна и помещаются в стеке для printf вызова, и теперь перезаписан в printf вызова. Таким образом, ваши данные были перезаписаны, а второй printf печатает мусор.

Если вы публикуете CreatePlayer, мы можем взглянуть на него.

+0

Да, напротив, весь 'playerCharacter' struct.is локален для 'createPlayer()' :( –