2

我写了以下内容:

#include <stdio.h>
#include <string.h>
char* getString();

char* getString(){
    char str[10];
    gets(str);
    return str;

}

int main() {

    char* s;
    s=getString();
    strcpy(s,"Hi");
    puts(s);
    return 0;
}

我知道 的长度str必须小于 10,但即使我只写了“Hi”,也没有打印任何内容。据我看,应该没问题。编译器这么说fgets is dangerous and should not be used

屏幕上什么都没有打印的原因是什么?

4

4 回答 4

6
char str[10];
// ...
return str;

这是错误的!!!局部变量在其作用域退出时失效;因此使用返回的数组是未定义的行为。您必须 malloc 一个字符串并返回它:

return strdup(str);
于 2012-07-17T06:50:32.390 回答
3

与结果有关的问题已经讨论过了。您可以执行的解决方案列表包括:

1)。将 str 全局定义为 "char str[10]" 并在函数 main 和 getString 中使用

2)。在函数 getString 中使用 malloc/calloc,代码是这样的......

char* getString(){
char *str = NULL;
str = (char *)calloc(10, sizeof(char));
gets(str);
return str;
}

int main() {
    char* s;
    s=getString();
    strcpy(s,"Hi");
    puts(s);
    free(s);
    return 0;
}`

3)。使用静态来获得帮助。但这不是概念上正确的方法

例如在函数getString中声明如下

static char str[10];
于 2012-07-17T07:14:48.900 回答
1

让你的代码工作的最简单的方法,虽然不一定是最好的方法,是str静态化。

IE

static char str[10];
于 2012-07-17T06:53:12.210 回答
0

那么是一个分配在堆栈str[10]上的 10 个字符的数组。函数超出范围后,堆栈将被删除。因此,函数返回的地址不再有效。getString()

考虑声明一个指针char *str并使用malloc. 现在您的变量指向堆中的一个位置,即使在函数完成执行后该位置仍然存在。

希望它回答了你的问题

于 2012-07-17T07:26:48.740 回答