牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-04-18 投稿人: 浏览次数:3777

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

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;
}

这里写图片描述

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

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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。