Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回C中的字符*_C - Fatal编程技术网

返回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标准的规范性部分没有将对象称为“变量”,除非在图书馆讨论的一些地方,我认为这些地方是无意的。如果您还想避免这种情况,可以说它是一个临时对象,在函数返回后其内容不受保证。