函数不能返回指向栈内存的指针!因为返回的都是值拷贝!
char *str = "abcd"这样就是字符串常量,这种能返回,而char str[] = "abcd"就不能在函数中返回了,因为这个是局部变量,函数结束后就内存释放了
如果非要进行返回局部变量,就只能用static来限制局部变量了,这样函数结束后就不会释放这个变量的内存了。
或者在被调用函数中用new命令申请空间,然后在调用完毕返回后用delete释放空间,不过这样做的坏处是接口不友好。
下面是四种情况分析
1.正确。最normal的情况。
int returnValue();
int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<returnValue();
return 0;
}
char returnValue()
{
int value=3;
return value;
}
2.错误。最normal错误。虽然value被释放,但是它的值不一定会被清除,所以有时候你这么用看起来结果好像也是对的,但是隐患无穷。
[cpp]
int* returnValue();
int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<*(returnValue());
return 0;
}
int* returnValue()
{
int value=3;
return &value;
}
3.正确。不用奇怪,“HelloJacky”是一个字符串常量,储存在只读数据段,return str只是返回了该字符串在只读数据段所在的首地址,当函数退出后,该字符串所在的内存不会被回收,所以是正常的。
[cpp]
char* returnValue();
int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<returnValue();
return 0;
}
char* returnValue()
{
char* str="HelloJacky";
return str;
}
4.错误。这一回“HelloJacky”是栈内的局部变量,函数退出时内存被释放,因此返回栈内局部变量的地址是错误的。
[cpp]
char* returnValue();
int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<returnValue();
return 0;
}
char* returnValue()
{
char str[]="HelloJacky";
return str;
}