函数返回值是指针的,不能返回函数内部的局部变量的地址,因为函数内部的局部变量在函数运行结束后生存期结束;
例如:
int* func()
{
int value;
return &value;//错误
}
int* func(int value)
{
return &value;//错误,形参也是函数内的局部变量
}
int* func(int *value)
{
return value;//这样是可以的,指针其实也是值传递,传指针也是将指针的值复制了一下
}
函数形参是函数内部内的局部变量,返回函数形参地址是不安全的,在以下示例中,虽然函数能返回形参地址,但返回后,形参已经释放了,且形参和实参的地址也不一样(当然不一样,因为实参是通过值传递给形参的,形参是一个临时变量),所以,这样做是不安全的。
int* func(int value)
{
qDebug()<<"hanshunei xingcan address:"<< &value<<endl;
return &value;
}
void main()
{
int aa =2;
qDebug()<<"shican address:"<<&aa<<endl;
qDebug()<<"xingcan address:"<< func(aa)<<endl;
qDebug()<<"xingcan value:"<< *(func(aa))<<endl;
}
当函数返回值为指针时,可以采用以下四种方式 :
1、函数形参是指针类型,返回形参相当于值传递
int* func(int *value)
{
return value;
}
2、函数中局部变量声明为static类型
int* func()
{
static int value = 1;
return &value;
}
声明为static的话,value的生命周期为整个程序的生命周期,故可以返回其地址。
3、函数中指向常量的指针
char* func()
{
char* value = "hello world";
return value;
}
4、函数中指针动态赋值(指向的内存位于堆,不free,该内存一直占用)
char* func()
{
char* value = (char*)malloc(sizeof(char));
return value;
}
总结:上述四种方式,第一种是值传递(将指针的值进行了值传递);第二种是变量存在静态存储区(static)、第三种是变量存储在常量区、第四种是变量存储在堆,存储在这三种的位置的变量的生命周期都不会随函数调用结束而结束。