scanf段错误和循环中的各种其他异常

Kai*_*ili 1 c scanf segmentation-fault

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);
}
Run Code Online (Sandbox Code Playgroud)

我得到了一些不同的错误,它们看起来并不真实(除了此时的段错误).这个代码大约10分钟前工作正常,然后它无限循环printf命令,现在它在上面提到的行上出现故障.我唯一改变的是scanf(">%s",command);它目前是什么.如果我将命令变量更改为数组,它就可以工作; 显然这是因为存储是为它预留的.

  1. 我被告知有人告诉别人他们需要malloc一个指针*(但这通常似乎解决了问题,如使它成为一个数组)
  2. 我输入的命令是"魔术" - 5个字符 - 所以不应该有任何疯狂的堆栈溢出.
  3. 我在Mac OS X 10.6上运行最新版本的xCode(非OS4)和标准gcc
  4. 这是我编译程序的方式: gcc --std=c99 -W sfs.c

只是想弄清楚发生了什么.由于这是一个学校项目我永远不会再看到,我只会编写一些noob工​​作,这会让我的老板哭泣:)但是之后我想知道为什么会发生这种情况而不仅仅是制作一些修复它,如果有一些修复它为什么修复工作.

Mar*_*ins 11

scanf尝试将它读取的数据存储到参数中(command在您的情况下).该变量尚未初始化为指向有效内存.因此,为其分配内存的malloc将使其有效.它也可以在堆栈中声明:

char command[somearraysize];
Run Code Online (Sandbox Code Playgroud)

  • 这些是C中非常基本的概念.当你将'command'传递给scanf函数时,scanf不能使指针指向某个地方,C也不能神奇地在堆栈上分配空间,指针指向那里.您需要提供存储空间. (4认同)

小智 11

 char command[100];
 scanf("%s",command);
Run Code Online (Sandbox Code Playgroud)

至于为什么这是必要的,我建议你读一本关于C的书,比如The C Programming Language.

  • 〜暗影不,你不明白. (21认同)
  • @Shadow:`char*command;`只在堆栈上分配一个未初始化的指针.然后你的`scanf`调用使用该指针将结果放在某处.那更清楚了吗? (16认同)
  • @ Neil,@ John:你在技术上都是正确的,但我怀疑你的回答过于尖刻,实际上你的意见得到了很好的接受.如果你要麻烦回应,你宁愿让这个人听从你的建议吗? (7认同)