函数返回值的生命周期是多少?

时间:2013-07-27 20:14:32

标签: c visual-c++ gcc gcc4

我读到了函数调用之间的return值,
 并尝试使用以下代码段:

/* file structaddr.c */
#include <stdio.h>    
#define MSIZE 10

struct simple
{   
    char c_str[MSIZE];
};
struct simple xprint(void)
{
    struct simple ret = { "Morning !" };
    return ret;
}
int main(void)
{   
    printf("Good %s\n", xprint().c_str);    
    return 0;
}

编译代码时没有错误和警告 使用 GCC 4.4.3(Ubuntu 4.4.3-4ubuntu5.1) Visual C ++ 编译器进行测试。

 gcc -m32 -std=c99 -Wall -o test  structaddr.c  
 cl -W3 -Zi -GS -TC -Fetest structaddr.c

输出:
早上好!

我对结果感到有点困惑 代码写得正确吗?

我的问题:

  • 函数return的可见性是什么(来自a的数组)    上面示例中的struct,以及如何正确访问它们?

  • 哪里结束return值的生命周期?

2 个答案:

答案 0 :(得分:6)

在C中,示例中临时的生命周期在printf表达式结束时结束:

  • Per C 2011(N1570)6.2.4 8,当包含它的完整表达式(或声明符)的评估结束时,临时的生命周期结束:“具有结构或联合类型的非左值表达式,其中结构或者union包含一个数组类型的成员(包括,递归地,所有包含的结构和联合的成员)引用具有自动存储持续时间和临时生命周期的对象.36)它的生命周期从评估表达式开始,其初始值是值的表达。当包含完整表达式或完整声明符的评估结束时,它的生命周期结束。“
  • Per 6.8 4:“完整表达式是一个不属于另一个表达式或声明符的表达式。”每个6.7.6 3:“完整的声明符是不属于另一个声明符的声明符。” / LI>
  • 因此,示例中临时的生命周期在printf表达式完成时结束。

在C ++中,示例中的生命周期与C中的生命周期相同:

  • Per C ++ 2010(N3092)12.2 3:“作为评估全表达式(1.9)的最后一步,临时对象被销毁,(词法上)包含创建它们的点。”
  • 每12.2 4和5:“有两种情况下,临时演员在与完整表达结束时不同的地方被摧毁。第一个上下文是调用默认构造函数来初始化数组的元素。如果构造函数具有一个或多个默认参数,则在构造下一个数组元素(如果有)之前,对默认参数表达式中创建的每个临时的销毁进行排序。“”第二个上下文是将引用绑定到临时的。引用绑定的临时值或作为绑定引用的子对象的完整对象的临时值在引用的生命周期内持续存在,除了:...“(为了简洁,我省略了例外,因为它们不适用此处。)
  • 因此,您的示例在C ++中是相同的,临时对象将作为评估printf表达式的最后一步而被销毁。

答案 1 :(得分:2)

函数xprint返回结构的副本,编译器将此副本存储在临时中,临时生命周期是printf函数调用的持续时间。当printf函数返回时,该临时对象将被销毁。