我找不到我的分段错误: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() 动态分配内存。