2017-02-19 21 views
1

Всякий раз, когда я запускаю эту структуру, я могу перейти к строке, в которой вы вводите модификатор конституции, и программа вылетает со всплывающим окном, которое читает «Инструкция на 0x00000000775AFDE9 ссылочной памяти на 0x000000007758D250. память не может быть записана. Нажмите OK для завершения. " Вот структура в вопросе:Референтная память не была написана

struct player_info create_player(void); 
struct player_info{ 
    char name[30]; 
    int Level, Str, Dex, Con, Int, Wis, Cha; 
}; 

struct player_info create_player(void){ 
    struct player_info aPlayer; 
    { 
     char c; 
     int i; 
     printf("Enter Player Name: "); 
     scanf("%s",aPlayer.name); 
     i = strlen(aPlayer.name); 
     do{ 
      scanf("%c", &c); 
      aPlayer.name[i++] = c; 
     } 
     while (c != '\n'); 
     aPlayer.name[i - 1] = 0; 
    } 

    printf("Level: "); 
    scanf("%d",aPlayer.Level); 

    printf("Strength Modifier: "); 
    scanf("%d",aPlayer.Str); 

    printf("Dexterity Modifier: "); 
    scanf("%d", aPlayer.Dex); 

    printf("Constitution Modifier: "); 
    scanf("%d", aPlayer.Con); 

    printf("Intelligence Modifier: "); 
    scanf("%d", aPlayer.Int); 

    printf("Wisdom Modifier: "); 
    scanf("%d", aPlayer.Wis); 

    printf("Charisma Modifier: "); 
    scanf("%d", aPlayer.Cha); 
    return aPlayer; 
}; 

И бита запись:

int save_data(){ 
      FILE* PlayerFile = fopen("players.txt","w"); 
      int i = 0; 

      for (i = 0; i < 1; i++){ 
      struct player_info aPlayer = create_player(); 
      fprintf(PlayerFile, "%s %d %d %d %d %d %d %d\n", aPlayer.name, aPlayer.Level, aPlayer.Str, aPlayer.Dex, aPlayer.Con, aPlayer.Int, aPlayer.Wis, aPlayer.Cha); 
      } 
      fclose(PlayerFile); 
      return 0; 
      } 

Теперь, чтобы быть ясно, я могу ввести до модификатора ловкости. Следующая строка, которая должна запрашивать конституцию, не печатается, и именно тогда я получаю всплывающее сообщение.

Я пробовал комментировать все, начиная от конституции, до харизмы, чтобы увидеть, и у меня такая же проблема. Удаление только части конституции тоже не работает. Я не совсем уверен, что здесь происходит; Я видел другие сообщения, говорящие о неправильном указателе, но я не вижу ничего подобного, если только это не одна из тех вещей, которые вы просто пропустите, и кому-то нужно указать это. В любом случае, любая помощь приветствуется.

+2

[Поднимите свои предупреждения на уровни педантичности] (http://pastebin.com/zUvX0UQi). – WhozCraig

+0

при вызове какого-либо семейства функций 'scanf()' всегда проверяйте возвращаемое значение (а не значение параметра), чтобы убедиться, что операция прошла успешно. – user3629249

+0

Функция: 'strlen()' возвращает 'size_t' не' int' – user3629249

ответ

4

scanf ожидает адрес переменной, которую вы намереваетесь написать. Так что

scanf("%d",aPlayer.Level); 

Должно быть это

scanf("%d", &aPlayer.Level); 

Для всех ваших статов. Способ, которым вы сейчас устанавливаете, включает передачу неопределенного целочисленного значения в scanf (переменная aPlayer.Level и компания неинициализированы), которая затем переинтерпретируется как адрес, который функция пытается записать. Поведение такого кода не определено.

+0

Я совсем забыл об этом, спасибо. Я изменил их все, но если я что-то пропустил, я все равно получаю ту же ошибку. – hego64

+0

@ hego64 - Начните с рекомендаций WhozCraig. И еще один вопрос, если это не поможет. Единственный другой подозрительный вид в вашем коде - это весь цикл do..while с 'aPlayer.name'. Но вы утверждаете, что это работает, поэтому я оставлю это на этом. – StoryTeller

+0

Я действительно получил это от другого вопроса, который я задал здесь. Этот код есть тот, на котором я основывался. http://stackoverflow.com/a/41896154/7471023 И как именно я могу включить предупреждения, как он предложил? – hego64