先请大家来看看如下程序,看是否能发现下面的程序中隐含的错误:
#include <stdio.h>
int main(void)
{
char *s1, *s2;
char *fun1(void), *fun2(void);
s1 = fun1();
printf("%s\n", s1);
s2 = fun2();
printf("%s\n", s2);
return 0;
}
char *fun1(void)
{
char x[] = "hello";
return x;
}
char *fun2(void)
{
char *x = "hello";
return x;
}
大家可以试着在自己的电脑中编译这个程序,会发现第一个 printf 打印的结果是一些乱七八糟的字符,而第二个打印出来的是正确的。第一个是返回一个指向自动变量的指针,而第二个是返回一个指向字符串常量的指针。当函数结束时,自动变量会自动地被销毁,也就是说返回指向自动变量的指针所指向的地址的内容已经面目全非了。当然如果将上面程序的 fun1 函数改为如下:
char *fun1(void)
{
static char x[] = "hello";
return x;
}
那么这也是正确的。因为静态变量的值在返回后还是一直保持着。