为了账号安全,请及时绑定邮箱和手机立即绑定

从C中的函数返回局部变量

从C中的函数返回局部变量

C C++
慕的地6264312 2019-06-06 10:41:15
从C中的函数返回局部变量#include <stdio.h>int foo1(void){     int p;     p = 99;     return p;}char *foo2(void){     char buffer[] = "test_123";     return buffer;}int *foo3(void){     int t[3] = {1,2,3};     return t;}int main(void){     int *p;     char *s;     printf("foo1: %d\n", foo1());     printf("foo2: %s\n", foo2());     printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]);     return 0;}当我用gcc -ansi -pedantic -W -Wall编译器为foo 2()和foo 3()发出警告消息:warning: function returns address of local variable我认为它不允许返回局部变量,但是foo 1()工作得很好,返回指向本地对象的指针与对象本身似乎有很大的区别。有人能说明一下这个问题吗?提前谢谢!
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

这里的问题是,当您创建局部变量时,它在堆栈上分配,因此在函数完成执行后不可用(这里的实现有所不同)。最好的方法是使用malloc()保留非本地内存。这里的危险是你必须交易(free())使用malloc(),如果您忘记了,则会造成内存泄漏。


查看完整回答
反对 回复 2019-06-06
?
偶然的你

TA贡献1841条经验 获得超3个赞

foo1(),您返回一个复制局部变量,而不是局部变量本身。

对于其他函数,可以返回指向局部变量的指针的副本。但是,当函数结束时,局部变量将被解除分配,因此,如果以后尝试引用它,最终会出现一些棘手的问题。


查看完整回答
反对 回复 2019-06-06
?
SMILET

TA贡献1796条经验 获得超4个赞

任何变量在内存中都有一些空间。指针引用该空间。当函数调用返回时,局部变量占用的空间将被取消分配,这意味着它可以并且将被重用于其他事情。因此,对那个空间的引用最终会指向完全不相关的东西。C中的数组是作为指针实现的,因此这将最终应用于它们。函数中声明的常量数组也算作本地数组。

如果要在创建数组的函数的作用域之外使用数组或其他指针,则需要使用malloc为其保留空间。使用malloc保留的空间在通过调用空闲显式释放之前不会重新分配或重用。


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 602 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信