C中的函数返回字符指针

时间:2017-10-11 17:24:59

标签: c

我是C语言的新手

这是我的代码:

char* getString()
{
char s[] = "Will I be printed?"; 
return s;
}
int main()
{
printf("%s", getString());
getchar();
}

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

现在当我编码时:

char* getString()
{
char *s = "Will I be printed?"; 
return s;
}
int main()
{
printf("%s", getString());
getchar();
}

它会打印字符串:"我会打印吗?"

为什么会这样? 是指示指针和字符数组都是LOCAL变量,它们存储在Stack ..?

P.S我正在使用http://ide.geeksforgeeks.org/

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

第二个功能有效,因为您正在创建指向不在本地定义的字符串的指针,它只是您可以使用的内存中的一个点。