天天看点

c/c++返回值为指针、引用时注意的地方

全局变量,局部静态变量,局部动态分配变量 都可以作为函数返回值。

局部自动变量不行

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 ;
}
           
c/c++返回值为指针、引用时注意的地方

可以看出来,函数内部等局部变量,存储在栈中的变量是不能作为返回值的,虽然可以读取正确的值,但是这是一块未分配的内存,当别的进程用到时就会出错,这个指针相当于野指针。返回值可以是局部动态分配的内存空间,这一部分分配在堆上,在主动释放之前别的进程是无法使用的内存区域。

不管是指针还是引用都是如此。