我是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/
答案 0 :(得分:2)
在这两种情况下,字符串文字本身可能存储在目标文件的只读数据区域中,该区域映射到程序的地址空间。
在第一种情况下,字符串的存储将在堆栈上分配,编译器可能会生成一些代码来生成存储在堆栈中的字符串副本。当函数返回时,回收该存储,并且尝试通过返回的指针从函数外部访问它是未定义的行为,并且您收到编译器警告。
在第二种情况下,字符串文字的地址存储在char *
变量中。它将直接指向字符串文字存储在运行时地址空间中的任何位置。当函数返回指针值时(注意:不是堆栈上的指针本身的地址,而是它所拥有的值,这是指向字符串存储区域的指针),该地址在该范围之外保持有效。功能,程序按预期工作。
答案 1 :(得分:0)
首先,不要标记这个C ++,它不是c ++。
它会抛出警告,因为您在函数的第一种形式中创建的数组是局部变量,一旦您超出范围,它就会被销毁。您将内存地址返回到基本上被删除的内容。
第二个功能有效,因为您正在创建指向不在本地定义的字符串的指针,它只是您可以使用的内存中的一个点。