0

我哪里错了,为什么?

#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);。我想不明白。输入字符串后,编译器停止工作,我收到一条错误消息:This program has stop working。你能指出我哪里出错了,以及这个问题的解决方法吗?标准库定义fgets为:

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

在 MinGW shell 上使用Sublime Text 2和GCC 。

基于指针概念的不同问题:和之间有什么区别char * str吗?char* strchar *str

4

3 回答 3

4

您需要为str

任何尺寸都说128。

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

或者

char str[128];

于 2013-08-12T18:20:39.517 回答
1

您还没有为str. 替换char *strchar *str = malloc(20);堆分配或char str[20]堆栈分配。

*将- 所有三个语句放在哪里都没有关系。

PS Sublime Text 2 只是一个文本编辑器,你使用哪个文本编辑器对程序没有影响。不过,编译器和操作系统确实很重要。

于 2013-08-12T18:19:29.857 回答
1

因此,回答我自己的问题时,我发布的代码会引发错误,因为我没有为名为str. 我只是给它一个任意的内存位置。

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

对于在堆栈上分配,使用char str[20]和 对于在堆上分配内存,使用char *str = malloc(20)or char *str = malloc(20*sizeof(char))

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

至于我的另一个问题,in*和的位置无关紧要。他们三个都是一样的。char* strchar * strchar *str

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

检查此StackOverflow 问题以获取更多详细信息。或者您也可以查看C 常见问题解答部分

于 2013-08-12T18:53:54.660 回答