// 1
#include<stdio.h>
char *arrstr()
{
char arr[]="Hello World !";
return arr;
}
int main()
{
char *str=arrstr();
printf("%s",str);
}
// 2
#include<stdio.h>
char *arrstr()
{
char *p="Hello World !";
return p;
}
int main()
{
char *str=arrstr();
printf("%s",str);
}
结果: 1 输出为乱码 2 输出 Hello World!
1、"hello world!"是一个字符串常量,存放在静态数据区,没错,但是把一个字符串常量赋值给了一个局部变量(char []型数组),该局部变量存放在栈中,这样就有两块内容一样的内存,也就是说“char p[]="hello world!";
”这条语句让“hello world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中,另一份在静态存储区。当arrstr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以打印出来的是乱码。
2、把字符串所在静态存储区的首地址赋给指针p , 当函数退出时,字符串常量所占内存不会被收回,所以能够顺利访问访问