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