scanf segfaults и различные другие аномалии внутри цикла while - PullRequest
1 голос
/ 13 апреля 2010
while(1){
    //Command prompt
    char *command;
    printf("%s>",current_working_directory);
    scanf("%s",command);<--seg faults after input has been received.
    printf("\ncommand:%s\n",command);
}

Я получаю несколько разных ошибок, и они не кажутся воспроизводимыми (за исключением segfault на данный момент). Этот код работал нормально около 10 минут назад, затем он бесконечно зацикливал команду printf, и теперь он вызывает ошибки в строке, упомянутой выше. Единственное, что я изменил, было scanf(">%s",command); на то, что есть на данный момент. Если я изменю переменную команды на массив, она будет работать; очевидно, это потому, что для него выделено хранилище.

  1. Меня привлекли к ответственности за то, что я сказал кому-то, что ему нужно malloc указатель * (но обычно это решает проблему, такую ​​как создание массива)
  2. Я ввожу команду "magic" - 5 символов, так что не должно быть никакого сумасшедшего переполнения стека.
  3. Я работаю на Mac OS X 10.6 с новейшей версией xCode (не OS4) и стандартным gcc
  4. Вот как я собираю программу: gcc --std=c99 -W sfs.c

Просто пытаюсь понять, что происходит. Так как это для школьного проекта, который я никогда больше не увижу, я просто напишу какую-нибудь работу по noob, которая заставит моего босса плакать :) Но потом я бы хотел выяснить почему это происходит, а не просто исправить это, и если есть какое-то исправление, почему это исправление.

Ответы [ 2 ]

11 голосов
/ 13 апреля 2010
 char command[100];
 scanf("%s",command);

Что касается того, почему это необходимо, я предлагаю прочитать книгу по Си, например Язык программирования Си

11 голосов
/ 13 апреля 2010

scanf пытается сохранить данные, которые он читает, в аргумент (command в вашем случае). Эта переменная не была инициализирована, чтобы указывать на допустимую память. Таким образом, malloc для назначения ему памяти сделает ее действительной. Он также может быть объявлен в стеке:

char command[somearraysize];
...