C语言中的字符串和字符串函数

C语言中的字符串和字符串函数,c,string,strcpy,C,String,Strcpy,我写了以下内容: #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; } #包

我写了以下内容:

#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;
}
#包括
#包括
char*getString();
char*getString(){
char-str[10];
获取(str);
返回str;
}
int main(){
char*s;
s=getString();
strcpy(s,“Hi”);
卖出(s);
返回0;
}
我知道
str
的长度必须小于10,但即使我只写了“Hi”,也没有打印任何内容。就我看来,应该没问题。编译器说,
fgets是危险的,不应该使用

屏幕上没有打印任何内容的原因是什么

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

return strdup(str);

使代码正常工作的最简单方法,虽然不一定是最好的方法,但就是使
str
静态

i、 e


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

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

static char str[10];
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) 。使用static提供即时帮助。但这在概念上并不正确

e、 g.在函数getString中声明如下

static char str[10];

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

考虑声明一个指针
char*str
,并使用
malloc
动态分配内存。现在,您的变量指向堆中的一个位置,即使在函数完成执行后,该位置仍将保持不变


希望它能回答您的问题

您返回的是本地。。。不要那样做……:)我很惊讶编译器没有给你一个警告。相关:当你调用函数getString时,它会为str分配10个字节,你可以在其中使用gets从stdin获取数据。现在,当您返回该值并退出函数时,str指向的10字节内存将无效。所以,你不应该再使用它了。你的意思是这样的吗?char*getString(){char*s;s=(char*)malloc(sizeof(char)*10);get(s);return s;}但是s这也是这个函数的局部变量,不是吗?所以这更多是因为内存并没有被保存?使用calloc/malloc分配的内存来自堆,程序可以访问/使用堆,直到内存块并没有被保存为止deallocated@Numerator我肯定有人会问这个问题。局部变量是指针;它在返回时无效,但由于它是一个指针,它的值将被复制(到寄存器、堆栈等,具体取决于调用约定),并且该指针仍将指向有效的、分配的内存地址。如果不是这样,函数就无法返回基元类型。是否必须在getString中初始化str?它不是有一个默认的初始化“0”(在我们的例子中相当于Null)吗?你说的是编译器依赖的。有些编译器初始化为零,而有些编译器可能导致垃圾值。因此,初始化以避免不可预测的行为总是很好的。sizeof(char)从malloc&co中转换返回值,gets和strcpy在读取作业应用程序中的示例代码时都是很好的过滤器。如果有人试图教他们良好的实践,那将是一件好事。