求问c++问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#include
using namespace std;
void change(char **a)
{
char *p = "world";
*a = p;
}
void main()
{
using namespace std;
char a[] = "asd";
char *p = a;
change(&p);
cout << p << endl;
system("pause");
}

调用的函数 意思是把主函数里p指针的指向改成函数里"world"的地址,但函数调用结束内存释放外部p不就成野指针了么,为什么还能输出world.

char *p = "world";
*a = p;

问题就在这两句,p虽然是一个局部变量,但world"由于是一个字符串常量,所以最后*a实际是执行内存里面的常量区,在change函数结束后,
这片区域并不会被释放或覆盖。所以最后还是能打印出world(上面的函数编译的时候会有警告)。如果上面的两句改成这样就出问题了:

char p[] = "world";
*a = p;

估计这才是你担心的问题

个人觉得 “world”是被分配在静态区,change里面的p是指向静态区的"world",它的值通过*a=p保存到了a所指内存中,也就是main函数里&p所指的内存,也就是main函数里的p的值变成了"world"的地址值,所以可以打印

char *p = "world";
world放在常量区,不会被释放。释放的是 p,不过释放前 p 已经被复制到参数 a了,而 a 不会被释放