`

函数返回局部变量

    博客分类:
  • c
C 
阅读更多


      一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
    下面以函数返回局部变量的指针举几个典型的例子来说明:
1:
[cpp] view plaincopy
#include <stdio.h>   
char *fanhui()   
{   
    char *p="qreqwer!";   
    return p;   
}   
int main()   
{   
    char *str;   
    str=fanhui();   
    printf("%s\n", str);   
    return 0;   
}  
这个没有任何问题,因为"qreqwer"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以fanhui函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问f
2:
[html] view plaincopy
#include <stdio.h>   
char *fanhui()   
{   
    char p[]="qeqwre!";   
    return p;   
}   
int main()   
{   
    char *str;   
    str=fanhui();   
    printf("%s\n", str);   
    return 0;   
}   
"qeqwre"是局部变量存放在栈中。当fanhui函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。 
3:
[html] view plaincopy
int func()  
{  
      int a;  
      ....  
      return a;    //允许  
}                     
  
int * func()  
{  
      int a;  
      ....  
      return &a;    //无意义,不应该这样做  
}   
局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,
因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量
被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存
期从定义起到程序结束。

4:如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。如下:
[html] view plaincopy
#include <stdio.h>   
char *returnStr()   
{   
    static char p[]="hello world!";   
    return p;   
}   
int main()   
{   
    char *str;   
     str=returnStr();   
    printf("%s\n", str);   
  
    return 0;   
}   
5: 数组是不能作为函数的返回值的,原因是编译器把数组名认为是局部变量(数组)的地址。返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。如下:
[html] view plaincopy
int* func( void )  
{  
    static int a[10];  
    ........  
    return a;  
}   
6:返回指向堆内存的指针是可以的
[html] view plaincopy
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释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。

分享到:
评论

相关推荐

    MATLAB自定义函数及局部变量_matlab源码.rar

    在MATLAB编程环境中,自定义函数和局部变量是两个核心概念,它们对于编写高效、可复用的代码至关重要。下面将详细阐述这两个概念及其在实际编程中的应用。 首先,MATLAB自定义函数允许用户根据需求创建自己的功能...

    MATLAB自定义函数及局部变量.docx

    4. 函数体:函数体内使用的除返回和输入变量这些在function语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除掉。 例如,以下是一个标准的自定义函数...

    MATLAB自定义函数及局部变量.pdf

    * 函数体:函数体内使用的除返回和输入变量这些在 function 语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在 MATLAB 的工作空间中清除掉。 例如,下面是一个标准的自定义...

    MATLAB自定义函数及局部变量 (2).docx

    4. 函数体:函数体内使用的除返回和输入变量这些在 function 语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在 MATLAB 的工作空间中清除掉。 二、局部变量和全局变量 在 ...

    全局变量、局部变量、静态全局变量、静态局部变量的区别

    局部变量的生命周期与其所在函数的执行周期一致,函数调用时创建,函数返回时销毁。 ### 静态全局变量(Static Global Variable) 静态全局变量是使用`static`关键字声明的全局变量。与普通全局变量相比,静态全局...

    C语言全局/局部变量

    举例来说,如果你有一个函数需要计算结果并返回,但不想让这个结果影响到其他函数,那么应该使用局部变量。而如果有一个状态标志需要在多个函数间共享,全局变量可能是更合适的选择。 在Keil App的项目中,我们可以...

    408函数-递归调用-全局变量和局部变量

    ### 408函数-递归调用-全局变量和局部变量 #### 一、CLion环境下新建文件及函数管理 在CLion环境下新建文件,尤其是C/C++源文件,对于项目的组织和代码的管理非常关键。为了提高编程效率和调试效果,我们需要遵循...

    全局变量&局部变量

    4. **栈区**:主要用来存储函数调用时的局部变量、函数参数及返回地址等。 #### 二、全局变量详解 **全局变量**是指在函数外部定义的变量,它在整个程序的生命周期内都是可见的,并且在整个程序中都可以被访问和...

    全局 局部变量以及static 变量区别

    - **特性**: 函数调用时创建,函数返回时销毁。 #### 三、作用域与可见性 - **全局变量**: - **可见性**: 在整个程序中可见。 - **作用**: 可以在任何函数中使用。 - **静态全局变量**: - **可见性**: 仅在其...

    static静态局部变量的妙用

    - **非静态局部变量**:每次函数调用时,都会重新创建这些变量,并在函数返回时销毁它们。因此,每次调用函数时,这些变量都会被重置为初始值。 - **静态局部变量**:即使函数调用结束,这些变量也会保留上一次调用...

    全局变量、静态全局变量、静态局部变量和局部变量的区别2.pdf

    3. **静态局部变量**:只在定义它的函数内部有效,但在函数执行期间只分配一次内存空间,函数返回后,变量依然存在。 4. **局部变量**:只在其定义的函数或代码块内有效,当函数或代码块执行完毕后即被销毁。 #### ...

    static静态局部变量的使用技巧

    这意味着局部变量会在每次函数调用时被创建,并在函数返回时销毁,它所占用的内存会在不同的函数调用间回收和重用。 然而,当局部变量被声明为static静态局部变量时,情况就有所不同。static关键字改变了局部变量的...

    全局变量、局部变量、静态变量即内存管理

    静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...

    C-C++程序设计员应聘常见面试试题深入剖析.doc

    - **返回局部变量指针的风险**:如果函数返回局部变量的地址,那么在函数外部继续使用这个地址将会导致未定义的行为,因为该局部变量已经不再存在。 ### 四、总结 通过上述分析,我们可以看出,即便是看似简单的`...

    3.8 函数参数与变量的作用域(ppt).pdf

    局部变量是在特定函数或过程中定义的,它们仅限于该函数或过程内部使用,外部无法直接访问。这意味着每个函数可以有自己的独立变量,互不影响,有利于数据的安全和管理。例如,在函数`wad`中,变量`x`和`y`就是局部...

    Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例

    本文实例讲述了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作。分享给大家供大家参考,具体如下: 实例对象也可以实现闭包的功能,不过实例对象消耗的资源(内存)比闭包多。 demo.py(闭包): # 闭包,...

    37_全局变量和局部变量的区别1

    当函数返回时,这些变量的内存会被回收。 3. **生命周期(Lifetime)** - **全局变量**:全局变量的生命周期从程序开始执行到程序结束,全程存在。它们在程序运行期间始终保留其值。 - **静态局部变量**:静态...

    第八天 08局部变量【千锋Python人工智能学院】1

    `locals()` 函数返回一个字典,包含当前作用域内的所有局部变量及其值,而 `globals()` 函数则返回全局变量的字典。例如: ```python def show_variables(): x = 10 print(locals()) # 输出 {'x': 10} show_...

    python数据清洗-17-局部变量.ev4.rar

    - **闭包**:当一个内嵌函数引用了外部函数的局部变量,并且返回这个内嵌函数时,就形成了闭包,此时外部函数的局部变量仍然可以被内嵌函数访问,即使外部函数已经执行完毕。 3. **在数据清洗中使用局部变量**: ...

Global site tag (gtag.js) - Google Analytics