精华内容
下载资源
问答
  • 局部变量作为返回值

    2019-04-09 22:54:52
    一般来说,函数是可以返回局部变量的,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址...

    一般来说,函数是可以返回局部变量的,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错,因为函数只是把指针赋值后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)
    下面以函数返回局部变量的指针举几个典型的例子来说明:

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

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

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

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

    int func()  
    {  
          int a;  
          ....  
          return a;    //允许  
    }                     
      
    int * func()  
    {  
          int a;  
          ....  
          return &a;    //无意义,不应该这样做  
    }   
    

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

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

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

    数组是不能作为函数的返回值的,==原因是编译器把数组名认为是局部变量(数组)的地址。返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。==如下

    int* func( void )  
    {  
       static int a[10];  
       ........  
       return a;  
    }   
    

    返回指向堆内存的指针是可以的

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

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

    展开全文
  • 局部变量作为返回值问题

    千次阅读 2014-04-23 18:10:57
    函数返回局部变量,是返回局部变量的值。但指针(或地址)是一种特殊的值,所以返回局部指针变量需要特别注意。正确情况下,作为函数返回值的局部指针,其所指向对象的作用域应该是调用者作用域、全局或静态常量区;...

            函数返回局部变量,是返回局部变量的值。但指针(或地址)是一种特殊的值,所以返回局部指针变量需要特别注意。正确情况下,作为函数返回值的局部指针,其所指向对象的作用域应该是调用者作用域、全局或静态常量区;指向栈空间对象的指针作为返回值,存在潜在的错误。

    1.       返回局部值变量

    1. int num(void)  
    2. {  
    3.          int a;  
    4.          return a;  
    5. }  
     函数返回时,将返回a的副本(值),然后a被注销,所以不存在问题。

     

    2.       返回局部指针变量

    2.1 返回局部指针执行调用者作用域的对象 

    1. char * strcpy( char *strDest, const char *strSrc )  
    2. {  
    3.     assert( (strDest != NULL) &&(strSrc != NULL) );  
    4.     char *strCopy = strDest;  
    5.     while( (*strDest++ = * strSrc++) != ‘/0’ );  
    6.     return strCopy;  
    7. }  
     

    strCopy虽然是局部指针变量,但返回的strCopy副本实质是指向调用者调用时传入的strDest地址对象,所以strcpy栈空间释放后,strCopy被注销但并不影响。


    2.2返回局部指针执行全局或静态常量作用域的对象

    1. char * retArr(void)  
    2. {  
    3.     char *arr="hello,world/n";  
    4.     //或static char arr[]="hello,world/n";   
    5.          return arr;  
    6. }  
     

    char *arr="hello,world/n"; "hello,world/n"存放在只读常量区,非栈内存空间不受函数返回影响。

    static char arr[]="hello,world/n"; "hello,world/n"存放在静态存储区(与全局变量相同),也不受函数返回的影响。

     

    2.3 错误返回局部指针的情形:返回执行局部对象的指针

     

    1. char * retArr(void)  
    2. {  
    3.     char arr[]="hello,world/n";  
    4.     //或static char arr[]="hello,world/n";   
    5.          return arr;  
    6. }  
     

    char arr[]="hello,world/n"; arr[]所有元素保持在栈内存上,arr是个符号地址,没有存储空间。当栈内存都会被回收后,返回的arr的副本所指地址可能已经不再是"hello,world/n"(由系统释放栈空间的时间觉得),所以存在潜在的风险。

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

    一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
    下面以函数返回局部变量的指针举几个典型的例子来说明:
    01.
    #include <stdio.h>
    char *returnStr()
    {
    char *p=“hello world!”;
    return p;
    }
    int main()
    {
    char *str;
    str=returnStr();
    printf("%s\n", str);
    return 0;
    }

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

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

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

    int func()
    {
    int a;

    return a; //允许
    }

    int * func()
    {
    int a;

    return &a; //无意义,不应该这样做
    }

    局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,

    因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量

    被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存

    期从定义起到程序结束。

    04.如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。如下:
    #include <stdio.h>
    char *returnStr()
    {
    static char p[]=“hello world!”;
    return p;
    }
    int main()
    {
    char *str;
    str=returnStr();
    printf("%s\n", str);

    return 0;   
    

    }

    05.数组是不能作为函数的返回值的,原因是编译器把数组名认为是局部变量(数组)的地址。返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。如下:
    int* func( void )
    {
    static int a[10];

    return a;
    }

    06.返回指向堆内存的指针是可以的
    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);
    }

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

    2.参考:https://www.cnblogs.com/xuhj001/p/3436175.html

    展开全文
  • 参考:《C语言程序设计(苏小红)》P334-351 动态内存分配 char *strA() {  char str[] = "hello word";  return str;...简单的来说,str是个局部变量的地址,...局部变量作为返回值时,一般是系统先申请一个临时...
  •  局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为...
  • golang 局部变量地址作为返回值的问题 func createNode(v int) *node{ return &node{value:v} } func main(){ var root *node root=createNode(10) ... } 在c/c++语言中,以上的代码逻辑显然有问题,...
  • 函数返回局部指针变量是否可行?  我们大家都知道指针函数的返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而...
  • 写了一个单链表,然后遇到一道题目 ...思索半天,原来是因为把函数内部的变量作为返回值而出现了问题 解决:把要做返回值的对象,改成函数调用时需要传进来的参数,返回值不要了,写成void,完美。 ...
  • 局部变量返回值

    千次阅读 2014-06-26 12:35:19
    发现自己对返回局部变量值的理解有些误区,网上查了下...当返回值局部变量时,实际上返回的是局部变量的拷贝。 当返回值局部变量指针时,返回的是指针的拷贝,由于变量值已经释放,指针指向的值是无效的值。 当
  • 然后可以知道当在一个被调用的函数中声明一个局部指针变量,并让其作为这个函数的返回值,这个时候gcc编译会通过,但是运行时就会崩溃,原因就是使用了野指针,而这个野指针的产生原因就是因为局部变量指针返回的...
  • 请教大神如下问题:根据C++的内存管理可以知道,在函数里面创建的对象是作为局部变量的,那么这个对象就会在 函数结束的时候被回收。但是如果将这个对象作为返回值返回出去呢?一样会被回收吗?
  • 一般的来说,函数是可以返回局部变量的,但是要注意几种情况。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果...
  • 否则结果可能正确,但存在风险。跳出函数后,局部变量已经没有作用域,不受控了,可能内存又分配给别的变量,内容被修改。
  • 这种对象是将他的成员变量值放在运行栈上的,当这个函数结束时,该函数的所有局部变量将被从栈中弹出,即释放;所以这种方式的变量是不能作为返回值的; 另一中方式就是: A *a = new A(5,5); 这是对象是个...
  •  局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为...
  • C++函数返回值局部变量

    千次阅读 2017-11-30 21:45:28
    C++函数的返回值局部变量时,该返回值可能是值类型、指针类型和引用类型。 以自定义类型MyStruct为例: struct MyStruct { int x; int y; }; 1 返回值是自定义结构的值类型 定义一个返回值为MyStruct的函数...
  • 局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数在返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是不...
  • 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放(就会造成内存泄漏的问题),程序结束...
  • 函数的调用以及完成调用的过程是函数在栈内存中入栈和出栈的过程,当函数被调用时,函数入栈,当函数调用完成之后,系统负责把函数占用栈内存自动释放,所以存在栈中的局部变量的占用的内存得到释放,如果此时把当前...
  • 局部变量和成员变量 1.定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中 2.作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用 成员变量:整个类...
  • Python学习(11)--函数变量返回值

    千次阅读 2018-01-04 21:37:06
    (1)局部变量与全局变量  Python中根据变量作用域的不同,可以分为局部变量和全局变量。所谓局部变量就是作用域仅限于函数内部的变量,而全局变量就是那些不仅可以作用于函数代码块内部,还可以作用于整个主函数体的...
  • 一、函数的返回值 返回值:函数运行的结果,还需要进一步操作时,给一个返回值 return用来返回函数执行结果,如果没有返回值,默认为None ...局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行...
  • 引用作为返回值

    2019-09-06 15:47:15
    引用作为返回值,必须遵守以下规则: 不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 不能返回函数内部new分配的内存的引用。...
  • 引用作为返回值:用引用接收和用变量接收的区别 #include<iostream> using namespace std; int& func() { int a = 10; return a; } int main() { //用引用类型接收返回类型为引用的局部变量 //因为&...
  • 函数的返回值 1.什么是返回值 """ 返回值是从函数里面传递到函数外面的数据 1) 怎么返回数据 返回值就是 return 关键字后面的表达式的值 语法: return 表达式1,表达式2,.... 说明: return - 关键字,只能出现在...
  • 一、在C#7.0以上版本中,方法的返回值可以通过关键字ref指定为返回变量的引用(而不是值)给调用方,这称为引用返回值(Reference Return Value,或ref returns); 1.与引用参数一样,使用关键字ref声明引用返回值...
  • return 自定义返回值 函数可以自定义返回值,通过return ,return会把这个值返回到函数的调用处 (1) return + 返回值 后面出了可以接6大标准数据类型之外,还可以返回函数和类对象, 如果没有定义任何返回值,默认返回的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 153,657
精华内容 61,462
关键字:

局部变量作为返回值