将函数的本地(函数内)变量中的引用返回给调用者

时间:2011-09-28 09:41:27

标签: c reference return-value

我的Q与这些非常相似,但不完全相同:

Returning const reference to local variable from a function

Returning function-local variable as reference

我有一些用于解析xml文件的代码。 基本上发生的是使用return语句通过函数的引用OUT传递局部变量。更确切地说:

ezxml_t ezxml_parse_fd(int fd){

ezxml_root_t root;
//DO STUFF
return &root->xml;
}

来电者如下

ezxml_t xml = ezxml_parse_fd(fd);

嗯,这个东西编译和工作(gcc)...但我一直都知道局部变量一旦它们的范围不再存在就会被破坏......我很困惑

4 个答案:

答案 0 :(得分:2)

本地变量“通过引用传递”,因为这意味着return &root;,这不是您的代码所说的。

相反,返回一个指向其他一些不相关的变量的指针,你不关心这些变量,我们应该假设代码被正确编写,以便指针指向一些动态分配的内存,这些内存将保留有效的。

答案 1 :(得分:1)

一旦函数返回,函数堆栈就会被解开&对函数局部变量的引用无效。你现在可以侥幸逃脱,但不要依赖它! 为什么不将输出参数传递给函数来存储值?也许,在这些方面:

void ezxml_parse_fd(int fd, ezxml_t *parse_value) 
{

ezxml_root_t root;
//DO STUFF
*parse_value = &root->xml;
return;
}

...

ezxml_t xml;
ezxml_parse_fd(fd, &xml);

如果您使用gcc,很可能会看到警告消息"警告:函数返回本地变量的地址" 请付款注意编译警告!它只是试图帮助你(大多数时候):)
希望这有帮助!

答案 2 :(得分:0)

是的,局部变量已被销毁,但您的引用指向内存中保存最后赋值的位置。放置变量的位置。对于简单类型,它在大多数情况下都适用于单线程环境。 但是当你在堆栈上使用析构函数分配一些对象时,析构函数将在块(在你的情况下 - 函数)的执行完成时被调用。因此,在函数外部,您可以引用被破坏的对象。 不久:不要这样做: - )

答案 3 :(得分:0)

在C中 - 这可能是非常错误的。 请告诉我们ezxml_t是什么以及root-> xml是什么。

我的猜测是ezxml_t会被你返回的root-> xml指针自动转换为。