这段代码中fgets的错误是什么?

时间:2013-08-12 18:15:58

标签: c pointers fgets

我哪里出错了,为什么?

#include<stdio.h>
#include<string.h>

int main()
{
char *str;
int length, i, j, flag = 0;

printf("\n\nEnter string: ");
fgets(str, 20, stdin);
printf("You entered: %s", str);
    return 0;
}

fgets(str, 20, stdin);行存在问题。我想不明白。输入字符串后,编译器停止工作,我收到错误消息:此程序已停止工作。你能指出我哪里出错了,还有解决这个问题的方法吗?标准库将fgets定义为:

char * fgets ( char * str, int num, FILE * stream );

我在MinGW shell上使用 Sublime Text 2 GCC

基于指针概念的另一个问题: char * strchar* strchar *str之间是否有任何差异?

3 个答案:

答案 0 :(得分:4)

您需要为str

分配内存

任何尺寸都说128。

char *str = malloc(128*sizeof(char));

char str[128];

答案 1 :(得分:1)

您尚未为str分配任何内存。将char *str替换为char *str = malloc(20);以进行堆分配,或将char str[20]替换为堆栈分配。

放置*的位置无关紧要 - 所有三个语句都相同。

P.S。 Sublime Text 2只是一个文本编辑器,您使用的文本编辑器对该程序没有任何影响。但是编译器和操作系统很重要。

答案 2 :(得分:1)

所以回答我自己的问题,我发布的代码引发了一个错误,因为我没有为名为str的变量分配内存。我只是给它一个任意的内存位置。

因此,为了使上述代码正常工作,我们可以在堆栈或堆上分配内存。

要在堆栈上进行分配,请使用char str[20]并在堆上分配内存,使用char *str = malloc(20)char *str = malloc(20*sizeof(char))

如果您不了解堆栈或堆,请不要过于担心细节。其中任何一个都适用于简单的控制台程序。

至于我的另一个问题,*char* strchar * strchar *str的位置并不重要。所有3个都是一样的。

我与@ P0W的答案相关的另一个问题是我们为什么不在malloc中转换char *str = malloc(20*sizeof(char))返回的内存地址。 这个问题的答案是它没有必要,应该在C中避免。包括stdlib.h头文件以获得解决方法。

检查此StackOverflow question以获取更多详细信息。或者您也可以查看C FAQ section