什么是函数返回值的生命周期? [英] What is a lifetime of a function return value?
问题描述
我阅读了函数调用之间的返回值
值,并使用以下代码片段进行了实验:
/ *文件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 \\\
,xprint()。c_str);
返回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
输出: 我对结果有些困惑。 我的问题: 函数 终止 在C ++中,您的示例中的生命周期相同如C中所示: I read about the The code is compiled without errors and warnings . Output : I'm a little confused by the result . My Question : What is the visibility of the function Where ends lifetime of a
早安!
代码被正确写入了吗?
$ b $在C中,当
的可见性是什么
value(在上例中,来自
struct
的数组),以及如何正确访问它们?
的返回值
的价值?
printf
表达式完成时,您示例中临时的生命周期结束:
printf
表达式的最后一步被销毁。
return
values between function calls,
and experimented with the following code snippet :/* 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;
}
Tested with GCC 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) and Visual C++ compilers . gcc -m32 -std=c99 -Wall -o test structaddr.c
cl -W3 -Zi -GS -TC -Fetest structaddr.c
Good Morning !
The code is written correctly ?
return
value( array from a
struct
in above example ), and how to properly access them ?return
value ?
In C, the lifetime of the temporary in your example ends when the printf
expression is finished:
- Per C 2011 (N1570) 6.2.4 8, the lifetime of a temporary ends when the evaluation of the full expression (or declarator) containing it ends: "A non-lvalue expression with structure or union type, where the structure or union contains a member with array type (including, recursively, members of all contained structures and unions) refers to an object with automatic storage duration and temporary lifetime.36) Its lifetime begins when the expression is evaluated and its initial value is the value of the expression. Its lifetime ends when the evaluation of the containing full expression or full declarator ends."
- Per 6.8 4: "A full expression is an expression that is not part of another expression or of a declarator." Per 6.7.6 3: "A full declarator is a declarator that is not part of another declarator."
- Therefore, the lifetime of the temporary in your example ends when the
printf
expression is finished.
In C++, the lifetime in your example is the same as in C:
- Per C++ 2010 (N3092) 12.2 3: "Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created."
- Per 12.2 4 and 5: "There are two contexts in which temporaries are destroyed at a different point than the end of the full- expression. The first context is when a default constructor is called to initialize an element of an array. If the constructor has one or more default arguments, the destruction of every temporary created in a default argument expression is sequenced before the construction of the next array element, if any." "The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference except:…" (I have omitted the exceptions for brevity, as they do not apply here.)
- So your example is the same in C++, the temporary object is destroyed as the last step in evaluating the
printf
expression.
这篇关于什么是函数返回值的生命周期?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!