全局变量,局部静态变量,局部动态分配变量 都可以作为函数返回值。
局部自动变量不行
int& func()
{
static int i=; //因为是全局的静态区 可以返回
i++;
return i;
}
int *getint()
{
int p=;
return &p;//提示返回临时变量
}
int *getint2()
{
int *p=(int*)malloc(sizeof(int)*);
*p=;
return p;
}
int &getint3()
{
int p=;
return p;//提示返回临时变量
}
int &getint4()
{
int *p=(int*)malloc(sizeof(int)*);
*p=;
*(p+)=;
return *p;
}
int main()
{
//测试返回函数
cout<<"getint() "<<*getint()<<endl;
int *ptr=getint2();
cout<<"getint2() "<<*ptr<<endl;
free(ptr);
cout<<"getint3() "<<getint3()<<endl;
int *ptr2=&getint4();
cout<<"getint4() "<<*(ptr2+)<<endl<<endl;//
free(ptr2);
cout<<"getint4() "<<*(ptr2+)<<endl<<endl;//
system("pause");
return ;
}
可以看出来,函数内部等局部变量,存储在栈中的变量是不能作为返回值的,虽然可以读取正确的值,但是这是一块未分配的内存,当别的进程用到时就会出错,这个指针相当于野指针。返回值可以是局部动态分配的内存空间,这一部分分配在堆上,在主动释放之前别的进程是无法使用的内存区域。
不管是指针还是引用都是如此。