Недавно я работал над 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;
}
Заранее спасибо!
Не могли бы вы добавить разделение ваших структур playerCharacter, mob, equipment, head и name? Интересуют функции, вызываемые в 1-й строке. – Coconop
_Первый printf работает отлично, но второй ..._ Эти инструкции идентичны и последовательны. Опубликуйте компилируемый код, который дает ошибку, о которой вы спрашиваете. Взгляните на [MCVE] (http://stackoverflow.com/help/mcve) – LPs
Мое предположение? createPlayer() возвращает указатель на локальный стек var, т.е. UB. –