无论我尝试什么,我都会得到一个错误。我将删除指针,删除malloc,我已经尝试以不同的方式读取用户输入。我来自Java背景,并且非常困惑为什么这些都不起作用。此外,我不是在尝试返回字符串数组,我只是在尝试在c中返回一个字符串或单个字符数组
main(){
char *c = getResources();
}
char * getResources(){
char *str = (char *) malloc(sizeof(char) * 3);
fgets(str, sizeof(str), stdin); /* read in a line */
return *str;
}
代码中有许多错误。
第一个是getResources((函数的返回值。您返回的是 (*str( 指向的值,这是一个字符,但您希望返回整个数组。 要修复它,您应该编写返回 str。
第二个是在sizeof((运算符中,它是一个编译时运算符。由于它是在编译时执行的,因此它现在不是运行时 char 数组 malloc-ed 的大小,而只是指针本身的大小。 因此,您不能以这种方式使用它,但您必须将其替换为数组的实际大小。
第三个是函数顺序。不能使用以前未声明的函数。您可以将完整的函数移到 main(( 之上,也可以将其声明在 main(( 之上并将实现留在它后面。
最后,main(( 函数应该返回一个整数。
额外提示:当您不再需要它时,不要忘记释放 malloc-ed 指针
固定代码可能如下:
char * getResources(){
size_t str_size = 3;
char *str = malloc(str_size);
fgets(str, str_size, stdin); /* read in a line */
return str;
}
int main(){
char *c = getResources();
/* do something with c */
free(c);
return 0;
}
您的问题是您返回的是*str
而不是指针str
:
return str;
此外,您正在读取sizeof(str)
字符,即指针的大小,可能因平台而异。 因此,您需要将其更改为3
,即分配给str
的字符数:
fgets(str, 3, stdin);
这个解决方案可能是最糟糕的C代码之一,但它在没有警告的情况下编译。请务必阅读对您的答案的所有评论,以及medalib和Andrea在答案中提供的信息。 我的代码只是将所有这些压缩成一大块东西,你可以复制粘贴......
#include <stdlib.h>
#include <stdio.h>
// define it before you use it; a prototype would also have worked
char* getResources(){
char *str = (char *) malloc(sizeof(char) * 3);
// second param is size of input to be expected;
// you passed it the size of a pointer, which is most
// definitely not what you want
fgets(str, 3, stdin); /* read in a line */
// return the pointer; str is already declared as a pointer,
// a further * will only de-reference that again
return str;
}
int main(){
char *c = getResources();
printf("%sn", c);
return 0;
}