C语言函数返回值实现机制

我们知道,在子函数中返回局部变量的值是不会出什么问题的,但是,返回一个局部变量的指针或者引用时,在后续解引用这个指针时就得不到理想的结果,原因在于:子函数中的自动变量(栈内存中的变量)会在子函数返回后被释放掉,但是返回值会被保存在cpu的寄存器中,因此,在返回子函数后,返回值能从寄存器中将返回值赋值给调用函数中的变量,如果返回值是一个指针,那么该指针所指的内存地址会被保存在寄存器中,但是,指针指向的内存却被释放掉了(即值未定义)。因此,在编写代码时一般不会返回指向局部变量的指针,除非一下三种情况:

1)子函数中定义了静态局部变量,函数可以返回指向该静态局部变量的指针。因为该变量分布在内存的静态区(在函数编译时就将被初始化),所以在子函数返回时该变量仍然存在。

char * func1(){

static char name[]="Jack";

return nema;

}

这里“Jack”存储在只读存储区,不能更改,将其赋值给name数组,即复制到静态存储区,因此name中保存的字符串不是常量字符串,可以通过数组下表进行更改。

2)子函数返回一个常量的指针,比如字符串常量,整形常量等。因为常量是定义在只读存储区,所以该常量也不会在子函数返回时被释放。

char * func2(){

char *name="Jack";

return nema;

}

3)子函数返回一个指向动态分配内存的指针。动态内存是在堆内存中分配的,需要程序员手动释放,否则造成内存泄漏,所以在手动释放该指针之前都可以返回该指针。

char * func3(){

char *name = (char *)malloc(20);

return nema;

}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值