容易出错的地方在于:指针作为返回值,但是指针指向的内存单元在函数返回后,内存单元释放了,这样就导致了指针成了野指针了!!!
//这样会报错,因为str数组元素为局部变量,存储在栈内,函数结束后,内容失效
char* func(char* name)
{
char str[5];
strcpy(str,name);
return str;
}
错误分析:
str为地址,返回值为char*,是进行了值传递,没有问题,但是,数组中的元素为局部变量,存储在栈中,函数外无效。
1、解决方法1:将数组定义为static
char* func(char *name)
{
static char str[5];
strcpy(str,name);
return str;
}
2、解决方法2:字符串为静态常量//存储在常量区
char* func()
{
char *str= “hello”;
//char str[]= "hello";
return str;
}
3、解决方法3:设置为动态数组
char* func(char* name)
{
char *str= (char*)malloc(5*sizeof(char));
strcpy(str,name);
return str;
}
4、解决方法4:设置为全局变量
char str[10];
char* func(char* name)
{
strcpy(str,name);
return str;
}
小结:通过以上方法,返回字符串,只要返回字符串首地址即可。
1)调用函数时,若直接输出的话,用一个字符指针接收即可:char *result = func(); cout <<result;
从从传出的首地址开始打印字符串,直至‘\0’。
2)调用函数时,若要获取返回的的字符串:
char result[5];
strcpy(result,func());
总结:1)字符串的赋值,需要使用strcpy()函数。
2)上述分析,实质为函数返回值为指针的情况,详细见该文。