先看例子:
例1:
#include <stdio.h>
char* get_str(void)
{
char str[] = {"abcd"};
return str;
}
int main(int argc, char* argv[])
{
char* p = get_str();
printf("%d/n", *p);
printf("%d/n", *(p+1));
return 0;
}
运行结果: 97 -12
例2:
#include <stdio.h>
char* get_str(void)
{
char* str = {"abcd"};
return str;
}
int main(int argc, char* argv[])
{
char* p = get_str();
printf("%d/n", *p);
printf("%d/n", *(p+1));
return 0;
}
运行结果:97 98
对于这样的运行结果是因为指针的地址虽然是在栈上,但是它指向的内容却是在堆上面,所以并没有被清除。而数组的地址和内容都是在栈上面(首地址除外),所以出错。
而对于 printf("%d/n", *p);能够输出正确的97,是因为首地址被当成指针来处理了,所以它的内容保存在堆上面,而其它的值保存在栈上面则被清除,从而产生了随机值,如-12。
在调用printf后,*p就被破坏了。