第一段代码是:
#include <stdio.h>
char *getString()
{
char *str = "Will I be printed?";
return str;
}
int main()
{
printf("%s", getString());
}
第二段代码是:
#include <stdio.h>
char *getString()
{
char str[] = "Will I be printed?";
return str;
}
int main()
{
printf("%s", getString());
}
在上述两个代码中,返回了char指针,指向可能被覆盖的局部变量但仍然代码1成功运行,而代码2打印Garbage值。
答案 0 :(得分:0)
让我们稍微扩展您的示例并查看存储数据的位置:
#include <stdio.h>
char* some_static_var="123";
char *getString1()
{
char *str = "Will I be printed?";
return str;
}
char *getString2()
{
char str[] = "Will I be printed?";
return str;
}
int main()
{
int some_var_at_stack=1;
printf("%p\n", &some_var_at_stack);
printf("%p\n", some_static_var);
printf("%p\n", getString1());
printf("%p\n", getString2());
}
我们得到了什么?在我的32位系统上:
0xbfc2005c
0x80497bc
0x8048554
0xbfc20035
如您所见,char * var =&#34; 123&#34;数据段中的点(https://en.wikipedia.org/wiki/Data_segment),但char []位于堆栈。
每当你离开你在堆栈中分配任何变量的函数时,这些变量都是未定义的,因为在堆栈中分配的数据(指针也是如此)在函数外部无效。但是在getString1()实际上将指针值返回到堆栈外的数据段,所以这个函数正常工作,但是在函数出口处分配的指针未定义。