返回C中的字符*
你知道为什么这个代码不起作用吗返回C中的字符*,c,C,你知道为什么这个代码不起作用吗 #include <stdio.h> char* get_name() { char string[4]; string[0] = 'A'; string[1] = 'N'; string[2] = 'A'; string[3] = '\0'; return string; } int main() { char *name = get_name(); printf("
#include <stdio.h>
char* get_name()
{
char string[4];
string[0] = 'A';
string[1] = 'N';
string[2] = 'A';
string[3] = '\0';
return string;
}
int main()
{
char *name = get_name();
printf("%s \n", name);
return 0;
}
#包括
char*get_name()
{
字符串[4];
字符串[0]=“A”;
字符串[1]=“N”;
字符串[2]=“A”;
字符串[3]=“\0”;
返回字符串;
}
int main()
{
char*name=get_name();
printf(“%s\n”,名称);
返回0;
}
谢谢。您的代码失败,因为返回的变量指针立即超出范围。您正在返回指向局部变量的指针。局部变量的作用域在函数返回时结束。因此,在作用域结束后尝试引用它们是错误的 您需要使用
malloc
来分配字符串。这样,您就可以分配一个对象,该对象的生命周期在函数结束后仍然有效
char* get_name()
{
char *string = malloc(4);
strcpy(string, "ANA");
return string;
}
请记住,您需要将对malloc
的每次调用与对free
的调用相匹配
char *name = get_name();
printf("%s \n", name);
free(name);
为了简化操作,我还省略了错误检查。
string
是一个局部变量。从get\u name
返回时,此变量不再存在。返回的是指向函数堆栈中变量的指针。重要的不是标识符的范围;它是对象的生命周期。例如,当函数返回时,在函数中定义的静态对象的标识符也会超出范围,但该对象的生存期仍然存在。@Eric是的,我的术语太草率了。我认为,对于要求理解“局部变量”的人来说,可能比理解“具有自动存储的对象”更容易。或者有更好更简单的说法吗?你可以说它是一个临时变量,在函数返回后其内容不能得到保证。@Eric我真的不认为这样更好。正如你所说,重要的不是变量,而是对象。从技术上讲,它是一个自动存储的对象。但我认为我的回答中的语言足够清晰,足以让人理解我的意思。我是在解决范围/生命周期问题,而不是将事物称为“变量”而不是对象的问题。C 2011标准的规范性部分没有将对象称为“变量”,除非在图书馆讨论的一些地方,我认为这些地方是无意的。如果您还想避免这种情况,可以说它是一个临时对象,在函数返回后其内容不受保证。