精华内容
下载资源
问答
  • 方法可以返回局部变量引用

    千次阅读 2016-04-14 20:02:05
     既然如此,为什么在Java中可以返回局部变量引用呢?虽然我现在还没有找到答案,但是有一种猜测。即,因为Java是自动回收机制,所以在方法中创建的局部变量不会随着方法调用结束而一起结束,所以,返回的引用仍然...

        在C++中,我们知道函数不能返回局部变量的引用,因为当函数调用结束后,局部变量会随着函数一起被销毁,因此局部变量的引用作为返回值实际上是指向空对象。

        既然如此,为什么在Java中可以返回局部变量的引用呢?虽然我现在还没有找到答案,但是有一种猜测。即,因为Java是自动回收机制,所以在方法中创建的局部变量不会随着方法调用结束而一起结束,所以,返回的引用仍然是有效的。如果是酱紫,辣么局部变量什么时候才会失效(被回收)呢?

    展开全文
  • C++不可以返回局部变量引用或指针

    千次阅读 热门讨论 2016-03-04 15:03:55
    所谓的不可以返回局部变量引用或指针,指的是不能返回局部变量引用或地址给引用或指针。事实上还是看该地址的位置是否在该函数的栈区,若是在栈区,函数调用结束,该地址就被释放了。尽管会出现栈地址上的值没被...

    返回引用事实上是返回变量的地址。

    所谓的不可以返回局部变量的引用或指针,指的是不能返回局部变量的引用或地址给引用或指针。事实上还是看该地址的位置是否在该函数的栈区,若是在栈区,函数调用结束,该地址就被释放了。尽管会出现栈地址上的值没被销毁的问题,可能是该栈区还没被其他的函数堆栈掉。

    1、int  & fun()

    {

    int a = 10;

    return a;

    }      

    不可以,尝试返回 a 的地址给引用变量,a是存在栈里的,函数结束调用栈被销毁。

    	std::string  & getstr()
    	{
            //1 不可以,虽然buffer是在字符常量区,但是这个函数返回的是string类型,string对象还在栈上
    		char *buffer = "abcdef";
    		return std::string(buffer);
            //2
    		//string str = "1213";
    		//return str;
    	}

     

    2、int  * fun()

    {

    int a = 10;

    return &a;

    }    

    不可以,尝试返回 a 的地址给指针,a是存在栈里的,函数结束调用栈被销毁。

     

    3、int   fun()

    {

    int a = 10;

    return a;

    }    

    可以,函数在返回的时候,返回处产生一个临时对象,用于存放局部变量a的值的一份拷贝(变量a的右值的拷贝)

    4、int *fun()

    {

    int  a = 10;

    int *p = &a

    return p;//返回的是变量a的地址而不是指针p的地址,尽管p的地址&p也在栈上。

    或:return &a;(同例2)

    }

    5、char *fun()

    {

    char *s = "1sfsdg";

    return s;//返回的是1sfsdg的地址,1sfsdg存储在字符常量区,也就在静态存储区。而指针变量s的地址&s是在栈上,会随着函数的调用完被销毁。

    }

    函数返回处产生一个对返回对象的“左值”s的拷贝,也就是在“左值”拷贝中存储了指向字符串常量1sfsdg的地址

    返回可以,因为返回的不是该函数的栈地址,而是静态存储区的地址。

    	char * getstr()
    	{
    
    		char buffer[100];
    		sprintf_s(buffer, "%d", 1234);
    		return buffer;
            //不可以,因为buffer在栈上
    	}

    6、int *fun()

    {

    int a[10]  = {.......};//静态数组

    return a;//静态数组,在预处理阶段就在该函数的栈上分配了空间,尝试返回一个栈地址,错误

    }

    返回不可以。

    7、int  *fun()

    {

    int *a = new int[10]//动态数组数组的空间在堆上,而指针变量a的地址&a在栈上,占4个字节,存储着堆    上动态数组的首地址。

    return a;//变量a的左值是一个局部变量指针,存储于函数栈上,右值 是“堆”的地址(“堆”的值是数组里面存的 值),函数返回处产生一个对返回变量的“左值”a的拷贝,也就是在“左值”的拷贝中存储了指向“堆”的地 址。

    }

    返回可以。

     

           通常,变量的意义在于,它给一块内存存储区提供名字,方便程序对这块内存进行读写。变量包含两个值:左值和右值。左值是内存存储区的名字,右值是存放存储区中的值。

     

     

        使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。

         new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有标识符名。

     一般使用格式:
    格式1:指针变量名=new 类型标识符;
            格式2:指针变量名=new 类型标识符(初始值);
            格式3:指针变量名=new 类型标识符 [内存单元个数];

    说明:格式1和格式2都是申请分配某一数据类型所占字节数的内存空间;但是格式2在内存分配成功后,同时将一初值存放到该内存单元中;而格式3可同时分配若干个内存单元,相当于形成一个动态数组。

     

    请注意“内存单元个数”不必是常量表达式,即它的值不必在编译时确定,可以在运行时确定。

         一维: int *a = new int[100];    //开辟一个大小为100的整型数组空间

         二维: int **a = new int[5][6]

         三维及其以上:依此类推.

         一般用法: new 类型 (初值)

    展开全文
  • 返回局部变量引用时,如果在函数外使用引用变量接收,会遇到它在栈上被释放的弊端。 int& getA(){ int a=10; return a; } int main(){ int &re = getA(); cout<<re<<endl; cout<<...

    返回局部变量引用时,如果在函数外使用引用变量接收,会遇到它在栈上被释放的弊端。

    int& getA(){
    	int a=10;
    	return a;
    }
    int main(){
    	int &re = getA();
    	cout<<re<<endl;
    	cout<<"----------------------"<<endl;
    	cout<<re<<endl;
    }

    展开全文
  • 一般的来说,函数是可以返回局部变量的。局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了,因此如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址...

    原文地址: https://blog.csdn.net/u012252959/article/details/79346146

    一般的来说,函数是可以返回局部变量的。局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了,因此如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错,准确的来说:

    函数不能通过返回指向栈内存的指针(仅指动态栈,返回堆存可行)

    下面以函数返回局部变量的指针举几个典型的例子来说明:

    1. 返回字符串常量指针

    #include <stdio.h> 
      
    char *returnStr(){
    	char *p = "hello world!";
    	return p;
    }
    
    int main(void){ 
        char *str = NULL;
        str = returnStr();
        printf("%s\n", str);
    	
        return 0;
    } 

    这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

    2. 返回栈指针

    #include <stdio.h>
    
    char *returnStr(){   
    	char p[] = "hello world!";
    	return p;
    }
    
    int main(){   
        char *str = NULL;   
        str = returnStr();   
        printf("%s\n", str);
    	
        return 0;   
    } 

    "hello world!"是局部变量存放在栈中,当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。

    3. 返回局部变量及其指针

    可以返回的情况: 局部变量(仅指变量,不包括指针,无论static还是auto)、静态局部变量的指针

    不可返回情况: 局部变量的指针(无static限定词,默认auto型)

    // 返回非静态局部变量
    int f1(){  
    	int a;  
    	....  
    	return a;    //允许  
    }                     
    
    // 返回静态局部变量
    int f2(){  
    	static int a;  
    	....  
    	return a;    //允许  
    }
    
    // 返回非静态局部变量指针
    int *f3(){  
    	int a;  
    	....  
    	return &a;    //无意义,不应该这样做  
    }
    
    // 返回静态局部变量指针
    int *f4(){  
    	static int a;  
    	....  
    	return &a;    //允许  
    } 

    局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存期从定义起到程序结束。

    4. 返回静态栈指针

    #include <stdio.h>
       
    char *returnStr(){   
    	static char p[] = "hello world!";
    	return p;
    }
       
    int main(void){   
    	char *str = NULL;
    	str = returnStr();
    	printf("%s\n", str); 
    
    	return 0;   
    } 

    如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型

    5. 返回数组指针

    没有使用static限定词时,数组默认存放在栈上,所以返回值无意义,如果想返回数组则需要添加static限定词,使数组成为静态,用法如下

    int *func(void){
    	static int a[10];
    	// int a[10];没有意义,函数退出导致栈销毁
    	........
    	return a;
    }

    6. 返回堆指针

    程序在运行的时候用 malloc 申请任意多少的内存,程序员自己负责在何时用 free释放内存,动态内存的生存期由程序员自己决定,使用非常灵活。

    char *GetMemory3(int num){
    	char *p = (char *)malloc(sizeof(char) * num);
    	return p;
    }
    
    void Test3(void){
    	char *str = NULL;
    	str = GetMemory3(100);
    	strcpy(str, "hello");
    	cout<< str << endl;
    	free(str);
    }

     

    展开全文
  •  一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的...
  • 返回局部变量引用的情况 书上都说不能返回局部变量引用或局部指针,说这种行为危险,但又没讲具体原因,那么今天就来看看这种行为的具体细节 PS:下面含有AT&T汇编内容,未学过汇编的朋友可以跳过直接看结论 ...
  • 函数返回局部变量的指针或引用

    千次阅读 2018-05-16 23:17:53
    我们往往需要遵循如下原则:引用作为返回值,必须遵守以下规则:(1)不能返回局部变量引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。...
  • C++Primer第7章函数一节,讲到返回时,“理解返回引用至关重要的是,千万不能返回局部变量引用”, 意思是返回程序内部定义的变量时可能会出问题,因为当函数执行完毕后,将释放分配给局部对象的存储空间。 此时,...
  • 千万不能返回局部变量引用??

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

    千次阅读 2016-05-21 20:16:02
    一般的来说,函数是可以返回局部变量的,但是要注意几种情况。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果...
  • 返回局部变量没问题 如果...返回局部变量引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以
  • 返回指向局部变量的指针或引用

    千次阅读 2014-11-04 08:57:03
    返回局部变量没问题 如果...返回局部变量引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以
  • C++中函数返回局部变量引用的问题

    千次阅读 2015-12-01 23:58:06
    初学C++, 看到书上及网上说函数返回值不能为指向函数局部变量的指针或者引用, 因为局部变量会在函数结束后销毁, 那么指向其位置的指针和引用就失效了, 有风险. 针对Deitel书上的习题, 写一个40位整数的四则运算, ...
  • 函数返回局部变量

    2013-08-13 09:31:06
    将指针返回后分配的内存将释放,指针变成野指针,也就是说不能返回局部变量,不过这个不能返回局部变量是针对指针而言的,并不是说所有的局部变量不能返回,先举个例子来说明可以函数可以返回局部变量的例子. ...
  • 指针,是一个无符号整数(unsigned int),它是...就像一个整形变量int a, a就可以代表一个整数,一个指针变量int* p,p就可以代表一个 地址数据,而*地址,代表去这个地址指向的内存空间取出里面的内容,因此如果是要
  • C++中不应该返回局部变量的地址

    千次阅读 2017-11-24 19:20:15
    在Effective C++中明确指出:不应该返回局部变量引用,原因在于:局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。如果比较理解函数局部变量的作用域和生命周期,...
  • Go语言---函数返回局部变量地址

    千次阅读 多人点赞 2018-05-05 21:10:52
    一、C语言中返回函数中局部变量值和指针(1) 在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空间,那为什么还可以返回局部变量,其实...
  • c++中将局部变量引用作为返回

    千次阅读 2018-11-05 18:57:21
    c++中可以引用作为返回值,比如下面这个函数 int &amp;c() { ...局部变量a的地址会被返回,但是局部变量a的内存空间会被释放。 int main() { int *p; p = &amp;c(); cout &l...
  • 局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数在返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是不...
  • 返回局部变量引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返回的。
  • C++ 之函数返回局部变量

    千次阅读 2019-08-17 15:26:51
    1. 返回字符串字面量的指针,即存放在常量存储区的数据,不会因为函数调用栈被释放而消失,所以操作可行。 char* const_str() { char* p = "Hello World!"; // 指向常量区字符串的指针 return p; } 另外,其实...
  • F.52: Prefer capturing by reference in lambdas that ...F.52 在lambda表达式中使用引用形式捕捉局部变量,包含向算法传递变量的情况。 译者注:如果你不清楚捕捉(capture)是什么,请参考 https://mp.weixin...
  • 当函数返回字符串的时候,我们可以定义返回string和string&。1写一个返回string引用的函数std::string & TestStringReference() { std::string loal_str = "holy shit";...返回局部变量或临时变量的地址: loal_str 即
  • 不能返回局部变量引用

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

    千次阅读 2011-12-24 11:12:10
    返回局部变量引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。 还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返回的。
  • 为什么C++函数可以返回Vector局部变量? C++语言中,所有new和malloc创建的变量均存放在堆区,这已经是一个共识。但是鲜为人知的是,STL库中的容器虽没有经过这两个关键字创建,但同样是存放在堆区。这与动态数组...
  • 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...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 248,257
精华内容 99,302
关键字:

引用可以返回局部变量吗