Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C是否在结束大括号之前销毁返回变量?_C - Fatal编程技术网

C是否在结束大括号之前销毁返回变量?

C是否在结束大括号之前销毁返回变量?,c,C,有人告诉我,在C(和C++)中,return语句中的变量在关闭函数的大括号之前被销毁 前- 真的是这样吗?如果是,函数如何向调用函数返回值 我的直觉告诉我,变量值在返回值处被推到堆栈上,当它返回到调用函数时,堆栈顶部通过获取返回值而弹出。不确定我是否正确 函数如何向调用函数返回值 你的直觉是对的(部分)。在某些体系结构中,值存储在堆栈中,并在返回调用方时弹出。但请记住,值是从函数返回的,而不是从变量本身返回的 :Ch-5:C功能: 当程序调用函数时,被调用函数必须知道如何返回其 调用方,因此调用

有人告诉我,在
C
(和
C++
)中,return语句中的变量在关闭函数的大括号之前被销毁

前-

真的是这样吗?如果是,函数如何向调用函数返回值

我的直觉告诉我,变量值在返回值处被推到堆栈上,当它返回到调用函数时,堆栈顶部通过获取返回值而弹出。不确定我是否正确

函数如何向调用函数返回值

你的直觉是对的(部分)。在某些体系结构中,值存储在堆栈中,并在返回调用方时弹出。但请记住,值是从函数返回的,而不是从变量本身返回的

:Ch-5:C功能: 当程序调用函数时,被调用函数必须知道如何返回其 调用方,因此调用函数的返回地址被推送到程序执行堆栈上(有时称为函数调用堆栈)

程序执行堆栈还包含程序中使用的局部变量的内存 程序执行期间对函数的每次调用。此数据存储为程序执行堆栈的一部分,称为函数调用的激活记录堆栈帧。当进行函数调用时,该函数调用的激活记录被推送到程序执行堆栈上。当函数返回到其调用者时,此函数调用的激活记录从堆栈中弹出,程序不再知道这些局部变量


编辑:正如其他人提到的,这是特定于实现的评论,我改变了主意。
对于x86,表示:

调用约定描述被调用代码的接口:
1.原子(标量)参数或复杂参数的各个部分的分配顺序
2. 参数的传递方式(压入堆栈、放入寄存器或两者的混合)
3.被调用者必须为调用者保留哪些寄存器
4.如何在调用者和被调用者之间分配为函数调用准备堆栈并在调用后恢复的任务
不同的编译器实现这些约定的方式往往存在细微差异

C是否在结束大括号之前销毁返回变量

是的。。。有点

局部变量在方法结束时超出范围,之后,它们就不再可访问

在C语言中,这仅仅意味着变量本身的存储可以用于其他用途。但变量没有主动的“破坏”

<>在C++中,变量的析构函数(如果有一个)将在变量超出范围时调用。 在实现级别,局部变量的存储空间通常使用堆栈进行管理。但我不认为这是由各自的语言规范强制执行的



同样重要的是要注意,我们谈论的是变量,而不是值。在您的示例中,变量的值将返回给调用者(参见
return
语句),并且将继续存在于
}
之外。

您需要理解返回值和返回指针或引用之间的区别。@PaulR我知道指针。这与指针无关。如何将值返回到父函数,以及在何时何地“销毁”局部变量,取决于具体实现。对于不同的编译器,它可能是不同的这应该清楚地表明返回的是一个值,而不是堆栈上的变量。不,您对堆栈的看法不正确,请重新阅读。如注释中所述,这是特定于实现的。在
int
的情况下,它更可能是一个寄存器而不是堆栈位置这只是一种建筑…@KarolyHorvath;谢谢你的链接。我从来不知道这些约定是由实现定义的。要学的东西太多了:(
int func() {
    int a = 10;
    return a; // I was told that a is destroyed here
}