精华内容
下载资源
问答
  • 函数在返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是涉及函数中变量地址的。如果要返回引用,也就是变量地址,那么它会把这个变量的地址放在...
    局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数在返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是不涉及函数中变量地址的。如果要返回引用,也就是变量地址,那么它会把这个变量的地址放在eax中,(注意这个地址是位于函数的栈空间里的,出了这个函数,这块内存就会被系统标记为可占用(就是其它程序可以占用)),回到主函数后系统会把这个地址赋值给主函数中的指针变量。此时主函数中的指针变量就指向了一个已经被标记为可占用的内存空间。如果你在不同的时刻输出这个指针所指地址的值会输出不同的结果。我的测试程序如下:
    #include <stdio.h>
    
    int * fun()
    {
     int p;
     p = 100;
     return &p;
    }
    int * fun2()
    {
     int p;
     p = 200;
     return &p;
    }
    void main()
    {
     int *p , *q;
     p = fun();
     printf("%d\n" , *p);
     q = fun2();
    
     printf("%d\n" , *p);
     return;
    }
    
    这个程序和缓冲区溢出攻击原理有点相似,
    另一种解说法方法
    返回值是数值时,是将函数中的局部变量里存的值赋给另一个变量
    例如a=fun(b,c);就是将fun函数里面的局部变量赋值给a,之后fun函数里的局部变量会释放,回收他们的内存空间,因此一旦出了fun函数,那么里面的局部变量就没有意义了。
    而返回引用的时候,引用的变量的内存空间不会因为函数结束而被回收,因此出了fun函数后,引用的变量仍会保持最后一次被改动的值。

    要么都不加,直接返回变量的副本 要么返回引用  此时局部变量声明为静态的 这两种情况都是对的,所以下面两种写法都是正确的:
    int add1(int a, int b) 

    int sum; 
    sum = a + b; 

    return sum; 


    int& add2(int a, int b) 

    static int sum; 
    sum = a + b; 

    return sum; 

    展开全文
  • 在编写c/c++代码时,调用函数的书写让程序变得整洁易读,但是调用函数的返回值(局部变量... 函数的返回值不能是局部对象或者是局部变量的指针或引用!!! 原因:  调用函数的局部变量是存在于栈中的,在执行完...

    在编写c/c++代码时,调用函数的书写让程序变得整洁易读,但是调用函数的返回值(局部变量的返回值,变量,结构体,数组等)也有注意事项。c/c++严禁返回局部变量的指针或引用。

    其实函数的返回值的规则非常好记:

      函数的返回值可以是数值和全局变量的指针或引用。

      函数的返回值不能是局部对象或者是局部变量的指针或引用!!!

    原因:

      调用函数的局部变量是存在于栈中的,在执行完调用函数之后会将局部变量的空间释放,也就是调用函数执行后局部变量将不存在与内存中。如果返回的是局部变量的指针或者是引用。返回给接收对象的是局部变量的地址,而这个地址的资源已经被释放了,也就是接受的返回值都将是空值(因为被释放),会出错。

     

    补充:局部变量返回指针或引用都是地址,而返回数值是值。(概念不同)

    转载于:https://www.cnblogs.com/spring-hailong/p/6135589.html

    展开全文
  • C++Primer第7章函数一节,讲到返回时,“理解返回引用至关重要的是,千万不能返回局部变量引用”, 意思是返回程序内部定义的变量时可能会出问题,因为当函数执行完毕后,将释放分配给局部对象的存储空间。 此时,...

    C++ Primer第7章函数一节,讲到返回时,“理解返回引用至关重要的是,千万不能返回局部变量的引用”,

    意思是返回程序内部定义的变量时可能会出问题,因为当函数执行完毕后,将释放分配给局部对象的存储空间。

    此时,对局部对象的引用就会指向不确定的内存。
     

    展开全文
  • 千万不能返回局部变量引用??

    千次阅读 2013-10-29 20:43:40
    C++ Primer第7章函数一节,讲到返回时,“理解返回引用至关重要的是,千万不能返回局部变量引用”, 意思是返回程序内部定义的变量时可能会出问题,因为当函数执行完毕后,将释放分配给局部对象的存储空间。 ...

    C++ Primer第7章函数一节,讲到返回时,“理解返回引用至关重要的是,千万不能返回局部变量的引用”,

    意思是返回程序内部定义的变量时可能会出问题,因为当函数执行完毕后,将释放分配给局部对象的存储空间。

    此时,对局部对象的引用就会指向不确定的内存。

    觉得不能理解。

    比如求阶乘时,可以使用迭代函数的方法,程序很简单,代码如下:

    #include <iostream>
    using namespace std;
    long factorial(int n)
    {
    int i;
    long result=1;
    for(i=n;i>=1;--i)
    result*=i;
    return result;
    }
    int main()
    {
    int n;
    long result;
    cout<<"输入n值"<<endl;
    cin>>n;
    result=factorial(n);
    cout<<n<<"的阶乘为"<<endl;
    cout<<result<<endl;
    return 0;
    }

    我在函数中定义的result必然是局部变量,但是作为结果,我必须将这个值返回,所以是不是我就违反了千万不能返回局部变量的引用呢,按照书上所说,rensult变量在函数执行完毕后空间就会被释放,那么这段程序就是错的。可是既然程序能运行出正确的结果,那就必然是正确的,真的很矛盾啊。

    展开全文
  • 函数返回局部变量的指针或引用

    千次阅读 2018-05-16 23:17:53
    我们往往需要遵循如下原则:引用作为返回值,必须遵守以下规则:(1)不能返回局部变量引用。主要原因是局部变量会在函数返回后被销毁,因此被返回引用就成为了"无所指"的引用,程序会进入未知状态。...
  • 最重要的一点:函数不能返回指向栈内存的指针! 为什么?因为返回的都是值拷贝!  一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果...
  • 杜绝返回函数内局部变量的指针或者引用
  • 一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不...准确的来说,函数不能通过返回指向栈内存的指针(注意
  • JNI局部变量和全局变量引用

    千次阅读 2017-03-08 11:04:41
    1.局部变量引用 定义在本地方法内的局部变量,会随着方法调用完return后,局部变量也会随着被释放。 所以,不要在本地方法中定义static变量来存储数据!举个栗子: 像上面这样子是不行滴!
  • 返回指向局部变量的指针或引用

    千次阅读 2014-11-04 08:57:03
    返回局部变量没问题 如果...返回局部变量引用也是绝对可以的。 引用只是变量的一个别名,变量本体都存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返
  • 当函数被调用时,函数入栈,当函数调用完成之后,系统负责把函数占用栈内存自动释放,所以存在栈中的局部变量的占用的内存得到释放,如果此时把当前局部变量的指针或引用返回给外部,外部函数得到的只是一个野指针...
  • 返回函数局部变量的指针和引用允许的,容易造成野指针。不管是通过返回值或者出参返回局部变量的指针都是允许的。 但针对各种情况,可以具体研究一下返回函数指针和引用的异常情况。   例子1: #...
  • //局部变量存放在栈区,不要在函数中返回局部变量的地址,函数退出后,局部变量的内存被系统自动释放 int* print() { int a = 10; return &a; } int main() { int *p = print(); cout<<*p<&...
  • 不能返回局部变量引用

    千次阅读 2009-03-01 13:19:00
    源之: ... int add1(int a, int b) { int sum; sum = a + b;...请问这两个函数返回有什么区别,是一个返回副本,另一个直接返回吗?...add1的确返回了一个副本,如果sum是自定义的类类型,...不能返回局部对象的引用
  • C++可以返回局部变量引用或指针

    千次阅读 多人点赞 2016-03-04 15:03:55
    所谓的不可以返回局部变量引用或指针,指的是不能返回局部变量引用或地址给引用或指针。事实上还是看该地址的位置是否在该函数的栈区,若是在栈区,函数调用结束,该地址就被释放了。尽管会出现栈地址上的值没被...
  • F.48 不要返回使用std:move从局部变量获得的右值引用 Reason(原因) With guaranteed copy elision, it is now almost always a pessimization to expressly use std::move in a return statement...
  • #include <iostream>...// 不要返回局部变量引用 int& sum() { int num = 10; int& rNum = num; // rNum 是局部变量引用 return rNum; } void test() { int x = 1; int y ...
  • 方法可以返回局部变量引用

    千次阅读 2016-04-14 20:02:05
    在C++中,我们知道函数不能返回局部变量引用,因为当函数调用结束后,局部变量会随着函数一起被销毁,因此局部变量引用作为返回值实际上是指向空对象。  既然如此,为什么在Java中可以返回局部变量引用呢?...
  • 返回局部变量没问题 如果...返回局部变量引用也是绝对可以的。 引用只是变量的一个别名,变量本体都存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返
  • 首先我们知道ref关键字是将值传递变为引用传递,那么我们先来看看ref locals(ref局部变量) 列子代码如下: static void Main(string[] args) { int x = 3; ref int x1 = ref x; //注意这里,我们通过ref关键字 把x...
  • C++返回局部变量引用的具体细节

    千次阅读 2020-06-04 17:04:23
    书上都说不能返回局部变量引用或局部指针,说这种行为危险,但又没讲具体原因,那么今天就来看看这种行为的具体细节 PS:下面含有AT&T汇编内容,未学过汇编的朋友可以跳过直接看结论 先放一个实验用函数,即...
  • c++中将局部变量引用作为返回

    千次阅读 2018-11-05 18:57:21
    c++中可以将引用作为返回值,比如下面这个函数 int &amp;c() { ...局部变量a的地址会被返回,但是局部变量a的内存空间会被释放。 int main() { int *p; p = &amp;c(); cout &l...
  • 主要介绍了了解PHP的返回引用局部静态变量,返回引用一般的写法是方法名前加&,局部静态变量也有很妙用,需要的朋友可以参考下
  • 函数在返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是涉及函数中变量地址的。如果要返回引用,也就是变量地址,那么它会把这个变量的地址放
  • 返回局部变量引用时,如果在函数外使用引用变量接收,会遇到它在栈上被释放的弊端。 int& getA(){ int a=10; return a; } int main(){ int &re = getA(); cout<<re<<endl; cout<<...
  • 返回局部变量引用

    2013-12-23 18:01:52
    int& func() { int m=9; return m; } void test() { int a = 19; return ; } ...}引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。 C++包含一个与指针有关的
  • C++中应该返回局部变量的地址

    千次阅读 2017-11-24 19:20:15
    在Effective C++中明确指出:不应该返回局部变量引用,原因在于:局部变量会在函数返回后被销毁,因此被返回引用就成为了”无...既然不能返回局部变量引用,如下所示,这样做是不合理的:int &getRefer() { int

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 261,238
精华内容 104,495
关键字:

局部变量不能返回引用