C中的函数返回字符指针


Function return character pointer in C

本问题已经有最佳答案,请猛点这里访问。

我不懂C语言

这是我的代码:

1
2
3
4
5
6
7
8
9
10
char* getString()
{
char s[] ="Will I be printed?";
return s;
}
int main()
{
printf("%s", getString());
getchar();
}

它显示警告:函数返回局部变量的地址

现在,当我编写代码时:

1
2
3
4
5
6
7
8
9
10
char* getString()
{
char *s ="Will I be printed?";
return s;
}
int main()
{
printf("%s", getString());
getchar();
}

它将打印字符串:"要打印吗?"

为什么会这样?指针和字符数组都是局部变量,并且存储在堆栈中,这是真的吗?

我正在使用http://ide.geeksforgeks.org/


在这两种情况下,字符串本身很可能存储在对象文件中的只读数据区域中,对象文件映射到程序的地址空间中。

在第一种情况下,字符串的存储将在堆栈上分配,编译器可能会生成一些代码来复制存储在堆栈上的字符串。当函数返回时,该存储将被回收,并试图通过返回到堆栈的指针从函数外部访问它,这是未定义的行为,您将收到编译器警告。

在第二种情况下,字符串文字的地址存储在char *变量中。它将直接指向字符串存储在运行时地址空间中的任何位置。当函数返回指针值时(注意:不是指针本身在堆栈上的地址,而是它所保存的值,它是字符串存储区域的指针),该地址在函数作用域之外仍然有效,并且程序按预期工作。


首先,不要标记这个C++,它不是C++。

它抛出警告,因为您在函数的第一个形式中创建的数组是一个局部变量,一旦超出范围就会被销毁。您正在将内存地址返回到一些基本上已被删除的内容。

第二个函数可以工作,因为您创建的指针指向的字符串不是本地定义的,它只是内存中的一个点,您可以使用它。