我最近一直在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;
}
提前致谢!
答案 0 :(得分:3)
第一个printf工作正常,但第二个[不]。
这表示您在第createPlayer
次呼叫中仍然可用的printf
中返回堆栈中的某些数据,并将其放置在printf
呼叫的堆栈中,现在被printf
电话覆盖。因此,您的数据已被覆盖,第二个printf
打印垃圾。
如果您发布CreatePlayer
,我们可以查看它。