C指针函数中的局部变量返回
Posted tianjiale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C指针函数中的局部变量返回相关的知识,希望对你有一定的参考价值。
所谓指针函数其实就是 :一个函数的返回值为指针。
指针函数定义:返回类型标识符* 函数名(形参列表){函数体}
eg: int* fun1(int n){}
指针函数和局部变量返回解析:
简单例子
#include<stdio.h> #include <unistd.h> int* fun1(int n); int main(void){ int n=100; int *p_sum=fun1(n);
printf("%d",*p_sum); //结果5050 sleep(1); printf("%d",*p_sum); //结果随机值 return 0; } int* fun1(int n){ int sum=0; int *p=∑ int i=0; for(i=1;i<=n;i++){ sum+=i; } return p; }
在window系统下编译器为DEV,返回结果为5050。
ubuntu下,返回结果为一个随机地址。(操作系统不同)
下面从ubuntu,详细解析一下,加入sleep之后,为何值会发生改变(随机地址)。
1.fun1是一个指针函数,被调函数的变量 sum ,sum为局部变量,存储在栈中,经过主函数sleep(1)之后,系统会回收其他函数的栈空间,也就是fun1里面的栈空间,被释放掉了。
2.若防止sum被释放的,可以加上static 如 static int sum=0,因为static 是存储在数据段里面,(局部变量/参数/返回地址均存储在栈中,全局变量/常量/静态变量则存储在数据段中),所以栈被释放掉了,数段段依然存在(生命周期,伴随整个文件)。
以上是关于C指针函数中的局部变量返回的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?
C 语言字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )