函数返回字符串首地址的有关问题

函数返回字符串首地址的问题
C/C++ code

char * returnString()
{
    char * pcTestStr;
    char TestStr[] = "OKOK"; 

    pcTestStr = TestStr;

    return pcTestStr;
}
int main()
{
    char * pcSrcStr;
    char str[20];
    
    pcSrcStr = str;

    printf("%s\n",pcSrcStr);

    return 0;       
}


这样打印出来的为什么是乱码,而不是OKOK?
returnString()函数改为
C/C++ code

char * returnString()
{
    char * pcTestStr = "OKOK"; 

    return pcTestStr;
}


这样打印出来的就是OKOK?求各位大神说明下,谢谢!

------解决方案--------------------
因为pcTestStr是局部变量,分配在栈上,函数返回的时候,指针已悬空,应该改为这样:
char * pcTestStr = (char*)malloc(20*sizeof(char));
strcpy(pcTestStr, "OKOK");
------解决方案--------------------
第一个出问题因为是因为那样写出来是局部变量,原因同2楼。第二个不出问题是因为字符串"OKOK"相当于是一个常量被编译在程序里面,也就是这个"OKOK"字符串的地址是全局有效的,虽然只在returnString函数中被引用到了。所以在returnString中返回的地址到main里面依然是有效的。
------解决方案--------------------
就行1楼说的那样,函数结束后,返回的指针成了野指针!
一般不要返回指向局部变量(栈上分配空间)的指针,因为栈区是系统管理的。改在堆上分配空间就可以了!
------解决方案--------------------
你这种非指针的普通类型是不一样的,相当于是值拷贝后返回。

探讨

引用:

因为pcTestStr是局部变量,分配在栈上,函数返回的时候,指针已悬空,应该改为这样:
char * pcTestStr = (char*)malloc(20*sizeof(char));
strcpy(pcTestStr, "OKOK");


如果有一个函数
int a()
{
int b = 0;
b = 3;

retu……