C/C++之函数返回值为指针或者是引用时常见错误总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011068702/article/details/64128702

1、说明

       函数如果是指针或则引用的返回,一般全局变量、局部静态变量、局部动态分配内存的变量可以使用作为函数的返回值,局部变量不行,因为局部变量函数调用完会自动销毁内存,这个时候返回的指针或则引用就有问题了。



2、展示代码

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

string& f1(const string &s)
{
    static string result = s;
    return result;
}
 
string f2(const string &s)
{
    string result = s;
    return result;
}


string &f3(const string &s)
{
    string *p = new string;
    *p = s;
    return *p;
}

int *f4() 
{
    int a = 10;
    return &a;
}

int *f5()
{
    static int a = 10;
    return &a;
}

int *f6()
{
   int *a = (int *)malloc(sizeof(int) * 10);
   *a = 10;
   *(a + 1) = 11;
   return a;
}

int &f7()
{
   int *a = (int *)malloc(sizeof(int) * 10);
   *a = 10;
   *(a + 1) = 11;
   return *a;
}

int &f8()
{
   int a = 10;
   return a;
}
int main()
{
    cout<<"hello word"<<endl;
    string s("chenyu");
    string result = f3(s);
    cout<<result<<endl;
    int *a = &f7();
    cout<<(*(a + 1))<<endl;
    free(a);
    return 0;
}



3、编译和运行结果

我们可以看到int *f4()和 int &f8()函数都提示,返回是本地变量,如果你自己亲自运行这几个函数,是会报错的,可以自测。



4、总结

      比如,我们看到函数返回的&a,特么我的第一反映是返回 引用,然后函数上面写得是返回指针,日了狗,这不矛盾吗?原来是我搞错了,特么返回&a,就是返回指针,是我基础不怎么好,没有看出来

      我们可以看出函数内部局部变量,存储在栈区的变量是不可以当返回值的,因为它由系统分配内存,然后函数调用完后,系统会销毁内存,而且别的进程读到就会报错,这个指针也相当于野指针了,而我们自己用malloc 或者new分配的内存,存在堆区,没有释放之前,别的进程无法使用该区域内存,所以自动分配内存是指针和引用都是可以作为函数返回值的。


展开阅读全文

没有更多推荐了,返回首页