char *strA1()
{
char str1[] = "hello world";
return str1;
}
char *strA2()
{
char* str2= "hello world111";
return str2;
}
int main(void)
{
char *ptr1 = strA1();
char *ptr2 = strA2();
printf("%s\n",ptr1); // 报错
printf("%s\n",ptr2);
return 0;
}
在 strA1() 中 str1为局部变量 存储在栈空间 中 相当于 在栈空间里面 开辟了一些空间 来存储 “hello world\0” 当函数返回后 栈空间里的字符串会释放掉,所以在主函数去访问时,访问的是已经释放掉了的空间 会报错
在 strA2() 中 char* str2 虽然也是局部变量 str2也是存放在栈里 ,但str 2指向的“hello world111”为常量字符串 存放在文字常量区 只有当程序结束后才释放,所以strA2()返回后,虽然str2这个局部变量已经释放掉了 但是ptr2已经指向了“hello world111” 所以正常访问
在 strA2()中 如果return之前 加上 *str2 = ‘t’ 会报错 因为str2 指向的是常量 不能修改
strA1() 中 如果 将 str1 改为 static char str1[] 就不会报错了 应为 static变量存放在全局区(静态区)只有当程序结束时才会释放
char str1[] = "hello world ";
str1[0] = 't' ; // OK
str1是不占存储空间的