一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明: 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释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
发表评论
-
使用execvp 来调用程序传参
2015-07-08 14:52 992注意: execvp 函数会根据环境变量来查找程序 ... -
mail
2015-06-08 18:36 0<?php /** * 邮件发送 ... -
学生管理系统
2015-04-22 11:23 0#include <stdio.h> #in ... -
双向链表 数字按降序排列
2015-03-06 14:47 1389#include <stdio.h> #in ... -
20个C语言中常用宏定义总结
2015-03-02 10:41 47720个C语言中常用宏定义总结 2012-09-16 10:5 ... -
lseek
2015-01-05 09:41 4101. 每个打开的文件都有一个与其相关的“文件位置”。 ... -
UC 文件系统
2014-12-30 13:16 631#include <stdio.h> #in ... -
open和fopen的区别:
2014-12-30 11:19 461open和fopen的区别: 1.缓冲文件系统 缓 ... -
c自己写的一些常用的函数
2014-12-26 15:56 0size_t mystrlen(const cha ... -
Socket
2014-12-01 16:31 0一、Socket简介 Socket ... -
检查姓名的几种方法
2014-11-10 11:06 0int CheckXm(char *str){ ... -
任意语言访问PostgreSQL:C语言接口
2014-11-10 10:17 0任意语言访问PostgreSQL:C语言接口 来源: ... -
assert()函数用法总结
2014-10-16 09:53 587assert宏的原型定义在<assert ... -
ADT 之 列表 C
2014-09-26 17:08 0list.h #ifndef __LIST_H__ ... -
指针释放之结构体
2014-09-03 18:10 663typedef struct{ uint ... -
error strerror 函数 用法
2014-08-26 16:15 717#include <stdio.h> #in ... -
uc 获取文件大小
2014-08-26 11:51 585#include <stdio.h> # ... -
一个字节中被置 1 的位的个数
2014-08-22 11:48 596第一种unsigned int TestAsOne ... -
C语言基础十一
2014-08-21 17:32 592指针数组是由多个同类 ... -
C语言基础十
2014-08-19 16:13 985malloc函数用于从堆中分配连续多个字节,如果失败则 ...
相关推荐
在MATLAB编程环境中,自定义函数和局部变量是两个核心概念,它们对于编写高效、可复用的代码至关重要。下面将详细阐述这两个概念及其在实际编程中的应用。 首先,MATLAB自定义函数允许用户根据需求创建自己的功能...
4. 函数体:函数体内使用的除返回和输入变量这些在function语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除掉。 例如,以下是一个标准的自定义函数...
* 函数体:函数体内使用的除返回和输入变量这些在 function 语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在 MATLAB 的工作空间中清除掉。 例如,下面是一个标准的自定义...
4. 函数体:函数体内使用的除返回和输入变量这些在 function 语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在 MATLAB 的工作空间中清除掉。 二、局部变量和全局变量 在 ...
局部变量的生命周期与其所在函数的执行周期一致,函数调用时创建,函数返回时销毁。 ### 静态全局变量(Static Global Variable) 静态全局变量是使用`static`关键字声明的全局变量。与普通全局变量相比,静态全局...
举例来说,如果你有一个函数需要计算结果并返回,但不想让这个结果影响到其他函数,那么应该使用局部变量。而如果有一个状态标志需要在多个函数间共享,全局变量可能是更合适的选择。 在Keil App的项目中,我们可以...
### 408函数-递归调用-全局变量和局部变量 #### 一、CLion环境下新建文件及函数管理 在CLion环境下新建文件,尤其是C/C++源文件,对于项目的组织和代码的管理非常关键。为了提高编程效率和调试效果,我们需要遵循...
4. **栈区**:主要用来存储函数调用时的局部变量、函数参数及返回地址等。 #### 二、全局变量详解 **全局变量**是指在函数外部定义的变量,它在整个程序的生命周期内都是可见的,并且在整个程序中都可以被访问和...
- **特性**: 函数调用时创建,函数返回时销毁。 #### 三、作用域与可见性 - **全局变量**: - **可见性**: 在整个程序中可见。 - **作用**: 可以在任何函数中使用。 - **静态全局变量**: - **可见性**: 仅在其...
- **非静态局部变量**:每次函数调用时,都会重新创建这些变量,并在函数返回时销毁它们。因此,每次调用函数时,这些变量都会被重置为初始值。 - **静态局部变量**:即使函数调用结束,这些变量也会保留上一次调用...
3. **静态局部变量**:只在定义它的函数内部有效,但在函数执行期间只分配一次内存空间,函数返回后,变量依然存在。 4. **局部变量**:只在其定义的函数或代码块内有效,当函数或代码块执行完毕后即被销毁。 #### ...
这意味着局部变量会在每次函数调用时被创建,并在函数返回时销毁,它所占用的内存会在不同的函数调用间回收和重用。 然而,当局部变量被声明为static静态局部变量时,情况就有所不同。static关键字改变了局部变量的...
静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
- **返回局部变量指针的风险**:如果函数返回局部变量的地址,那么在函数外部继续使用这个地址将会导致未定义的行为,因为该局部变量已经不再存在。 ### 四、总结 通过上述分析,我们可以看出,即便是看似简单的`...
局部变量是在特定函数或过程中定义的,它们仅限于该函数或过程内部使用,外部无法直接访问。这意味着每个函数可以有自己的独立变量,互不影响,有利于数据的安全和管理。例如,在函数`wad`中,变量`x`和`y`就是局部...
本文实例讲述了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作。分享给大家供大家参考,具体如下: 实例对象也可以实现闭包的功能,不过实例对象消耗的资源(内存)比闭包多。 demo.py(闭包): # 闭包,...
当函数返回时,这些变量的内存会被回收。 3. **生命周期(Lifetime)** - **全局变量**:全局变量的生命周期从程序开始执行到程序结束,全程存在。它们在程序运行期间始终保留其值。 - **静态局部变量**:静态...
`locals()` 函数返回一个字典,包含当前作用域内的所有局部变量及其值,而 `globals()` 函数则返回全局变量的字典。例如: ```python def show_variables(): x = 10 print(locals()) # 输出 {'x': 10} show_...
- **闭包**:当一个内嵌函数引用了外部函数的局部变量,并且返回这个内嵌函数时,就形成了闭包,此时外部函数的局部变量仍然可以被内嵌函数访问,即使外部函数已经执行完毕。 3. **在数据清洗中使用局部变量**: ...