我正试图从键盘中取出字符串。当我尝试这个时它没有用。
char *s;
fgets(s,80, stdin);
当我尝试使用上面的代码时,我遇到了分段错误。但是,当我使用下面的代码时,它可以工作,而且我不会遇到分段错误。
char s[81];
fgets(s, 80, stdin);
当我尝试使用指针(char *s
)存储字符串时,为什么会出现分段错误?
答案 0 :(得分:1)
这是因为当你做
时char *s;
此时s
具有垃圾值,指向无效的地址。取消引用它将导致未定义的行为,在您遇到分段错误的情况下。
您需要先使用malloc分配一些内存。
s = malloc (sizeof (char) * 81);
fgets (s, 80, stdin);
并且,在完成记忆后,请务必记住使用
释放它free (s);
这将有助于您在较大程序中明显的内存泄漏。
答案 1 :(得分:0)
因为在第一个示例中没有分配任何内存来存储字符串。 在第一个示例中,您有一个本地未初始化的指针(这意味着它有一些垃圾值)。当您调用fgets时,程序会尝试覆盖此指针所指向的内存。因为您尚未分配此空间,所以会出现分段错误。
您的第二个示例char s[81];
不会抛出段错误,因为您在堆栈上分配了81个字节,这是fgets将用于覆盖的内容。