我哪里出错了,为什么?
#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 * str
,char* str
和char *str
之间是否有任何差异?
答案 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* str
和char * str
中char *str
的位置并不重要。所有3个都是一样的。
我与@ P0W的答案相关的另一个问题是我们为什么不在malloc
中转换char *str = malloc(20*sizeof(char))
返回的内存地址。
这个问题的答案是它没有必要,应该在C中避免。包括stdlib.h
头文件以获得解决方法。
检查此StackOverflow question以获取更多详细信息。或者您也可以查看C FAQ section。