char* fun1()
{
char *a;
a = "c语言的那些小坑";
return a;
}
char* fun2()
{
char a[128];
sprintf(a, "c语言的那些小坑");
return a;
}
先看上面的代码 fun1 和 fun2那个会出问题?
从运行结果来看 明显fun2挂了一堆乱码
fun1却是正确的,为啥呢?
我们都知道当函数结束时返回值被保存在栈内而局部变量都被销毁了
而上面fun1和fun2返回的都是一个char*指针---也就是一个内存地址
fun2在函数结束后,返回的地址是char a[128];这个局部变量的地址
但是a变量已经实际内容已经被清空了,所以打印这个地址遇到一串随机数。或者空就不奇怪了。
那为什么fun1的打印是正确的?
a = "c语言的那些小坑";
就应为这个字符串是一个常量所以不再销毁的范围内
所以fun1函数结束后返回的a变量的地址内容任然存在
所以printf("坑1%s \r\n", fun1()); 就没问题。
printf("坑2%s \r\n", fun2());就有问题