我找不到我的分段错误:11 错误
I can't find my segmentation fault: 11 error
我是C新手,想打破系列视频来尝试一个项目,但我卡在了分割错误上。我明白这意味着我正在尝试访问我不允许访问的内存,但我没有看到问题......我有很多代码所以我会粘贴看起来可能导致的部分问题并取出包含。我正在制作一个命令行文本冒险游戏,其中两个玩家可以选择他们的名字、class 和种族(目前游戏在要求他们输入后结束)。我很感激:
main.c
int main() {
// See term dimesions
// Create Player
struct User* Player;
CreatePlayer(Player);
// Create Player
struct User* Player2;
CreatePlayer(Player2);
return 0;
}
story.c
void CreatePlayer(struct User* Player) {
char name[MAXINPUT];
char class[MAXINPUT];
char race[MAXINPUT];
// Ask for name
printf("%sWhat is your name?\n:\t", KNRM);
getInput(name);
printf("%sHello %s!\n", KNRM, name);
{
// Ask for class
char question[] = "What is your class (Type '1' for Fighter or '2' for Mage)?\n:\t";
char options[] = "12";
char coorilations[][MAXINPUT] = {"Fighter", "Mage"};
questionLoop(question, options, coorilations, class);
InitializeClass(Player, class);
printf("%sYou are now a %s!\n", KNRM, class);
}
{
// Ask for race
char question[] = "What is your race (Type '1' for Human or '2' for Elf)?\n:\t";
char options[] = "12";
char coorilations[][MAXINPUT] = {"Human", "Elf"};
questionLoop(question, options, coorilations, race);
printf("%sYou are now a %s!\n", KNRM, race);
}
strcpy(Player->name, name);
strcpy(Player->race, race);
}
modules.c
void InitializeClass(struct User* Player, char* class) {
if (compare(class, "Fighter")) {
strcpy(Player->class.name, "Fighter");
Player->class.maxHealth = 10;
Player->class.health = 10;
Player->class.strength = 7;
} else if (compare(class, "Mage")) {
strcpy(Player->class.name, "Mage");
Player->class.maxHealth = 7;
Player->class.health = 7;
Player->class.strength = 10;
}
}
void getInput(char res[]) {
int i = 0;
int c;
printf("%s", KMAG);
c = getchar();
while(c != '\n') {
res[i++] = c;
c = getchar();
}
res[i] = '[=12=]';
}
void questionLoop(char question[], char options[], char coorilations[][MAXINPUT], char var[]) {
printf("%s-------------------------------\n", KGRN);
printf("%s%s", KNRM, question);
getInput(var);
for(int i = 0; i < strlen(options); i++) {
if (options[i] == var[0] && var[1] == '[=12=]') {
strcpy(var, coorilations[i]);
printf("%s", KNRM);
return;
}
}
printf("%sSorry that was not an option...\n", KNRM);
questionLoop(question, options, coorilations, var);
}
int compare(char one[], char two[]) {
for (int i = 0; one[i] != '[=12=]'; i++) {
if (one[i] != two[i]) {
return 0;
}
}
return 1;
}
modules.h
#ifndef HEADER_FILE
#define HEADER_FILE
#define MAXINPUT 20
#define KNRM "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
// Classes
struct Class {
char name[MAXINPUT];
int strength;
int health;
int maxHealth;
};
// User struct
struct User {
char name[MAXINPUT];
char race[MAXINPUT];
struct Class class;
};
// Utilities
void getInput(char res[]);
void questionLoop(char question[], char options[], char coorilations[][MAXINPUT], char var[]);
int compare(char one[], char two[]);
// Game Setup Functions
void CreatePlayer(struct User*);
void InitializeClass(struct User* Player, char* class);
// Game Functions
void GameLoop(struct User*);
void ViewStats(struct User*);
#endif
这声明了一个指针:
struct User* Player;
然而,它是完全未初始化的。在用某些东西填充它之前不能使用它。 CreatePlayer
函数应该承担这个责任。
这些函数通常如下所示:
struct User* CreatePlayer() {
struct User *player = malloc(sizeof(struct User));
if (player == NULL) {
return NULL;
}
// Do stuff with player
return player;
}
该模式可用于任何“创建”类型的函数。
你从来没有为你的 Player
分配内存,所以从你的主要方法,你调用 CreatePlayer()
,它又调用 questionLoop()
,它在内存分配方面什么都不做,然后 InitializeClass()
,它(除其他外):
strcpy(Player->class.name, "Fighter");
但是 Player
不存在,因为你还没有真正创建它,你还没有为它分配,因此发生了分段错误(这里是该方法的下一行) .
完成后尝试使用 malloc()
(e.g. struct User* player = malloc(sizeof(struct User));
, and don't forget to free()
动态分配内存。
我是C新手,想打破系列视频来尝试一个项目,但我卡在了分割错误上。我明白这意味着我正在尝试访问我不允许访问的内存,但我没有看到问题......我有很多代码所以我会粘贴看起来可能导致的部分问题并取出包含。我正在制作一个命令行文本冒险游戏,其中两个玩家可以选择他们的名字、class 和种族(目前游戏在要求他们输入后结束)。我很感激:
main.c
int main() {
// See term dimesions
// Create Player
struct User* Player;
CreatePlayer(Player);
// Create Player
struct User* Player2;
CreatePlayer(Player2);
return 0;
}
story.c
void CreatePlayer(struct User* Player) {
char name[MAXINPUT];
char class[MAXINPUT];
char race[MAXINPUT];
// Ask for name
printf("%sWhat is your name?\n:\t", KNRM);
getInput(name);
printf("%sHello %s!\n", KNRM, name);
{
// Ask for class
char question[] = "What is your class (Type '1' for Fighter or '2' for Mage)?\n:\t";
char options[] = "12";
char coorilations[][MAXINPUT] = {"Fighter", "Mage"};
questionLoop(question, options, coorilations, class);
InitializeClass(Player, class);
printf("%sYou are now a %s!\n", KNRM, class);
}
{
// Ask for race
char question[] = "What is your race (Type '1' for Human or '2' for Elf)?\n:\t";
char options[] = "12";
char coorilations[][MAXINPUT] = {"Human", "Elf"};
questionLoop(question, options, coorilations, race);
printf("%sYou are now a %s!\n", KNRM, race);
}
strcpy(Player->name, name);
strcpy(Player->race, race);
}
modules.c
void InitializeClass(struct User* Player, char* class) {
if (compare(class, "Fighter")) {
strcpy(Player->class.name, "Fighter");
Player->class.maxHealth = 10;
Player->class.health = 10;
Player->class.strength = 7;
} else if (compare(class, "Mage")) {
strcpy(Player->class.name, "Mage");
Player->class.maxHealth = 7;
Player->class.health = 7;
Player->class.strength = 10;
}
}
void getInput(char res[]) {
int i = 0;
int c;
printf("%s", KMAG);
c = getchar();
while(c != '\n') {
res[i++] = c;
c = getchar();
}
res[i] = '[=12=]';
}
void questionLoop(char question[], char options[], char coorilations[][MAXINPUT], char var[]) {
printf("%s-------------------------------\n", KGRN);
printf("%s%s", KNRM, question);
getInput(var);
for(int i = 0; i < strlen(options); i++) {
if (options[i] == var[0] && var[1] == '[=12=]') {
strcpy(var, coorilations[i]);
printf("%s", KNRM);
return;
}
}
printf("%sSorry that was not an option...\n", KNRM);
questionLoop(question, options, coorilations, var);
}
int compare(char one[], char two[]) {
for (int i = 0; one[i] != '[=12=]'; i++) {
if (one[i] != two[i]) {
return 0;
}
}
return 1;
}
modules.h
#ifndef HEADER_FILE
#define HEADER_FILE
#define MAXINPUT 20
#define KNRM "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
// Classes
struct Class {
char name[MAXINPUT];
int strength;
int health;
int maxHealth;
};
// User struct
struct User {
char name[MAXINPUT];
char race[MAXINPUT];
struct Class class;
};
// Utilities
void getInput(char res[]);
void questionLoop(char question[], char options[], char coorilations[][MAXINPUT], char var[]);
int compare(char one[], char two[]);
// Game Setup Functions
void CreatePlayer(struct User*);
void InitializeClass(struct User* Player, char* class);
// Game Functions
void GameLoop(struct User*);
void ViewStats(struct User*);
#endif
这声明了一个指针:
struct User* Player;
然而,它是完全未初始化的。在用某些东西填充它之前不能使用它。 CreatePlayer
函数应该承担这个责任。
这些函数通常如下所示:
struct User* CreatePlayer() {
struct User *player = malloc(sizeof(struct User));
if (player == NULL) {
return NULL;
}
// Do stuff with player
return player;
}
该模式可用于任何“创建”类型的函数。
你从来没有为你的 Player
分配内存,所以从你的主要方法,你调用 CreatePlayer()
,它又调用 questionLoop()
,它在内存分配方面什么都不做,然后 InitializeClass()
,它(除其他外):
strcpy(Player->class.name, "Fighter");
但是 Player
不存在,因为你还没有真正创建它,你还没有为它分配,因此发生了分段错误(这里是该方法的下一行) .
完成后尝试使用 malloc()
(e.g. struct User* player = malloc(sizeof(struct User));
, and don't forget to free()
动态分配内存。