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