当函数返回一个结构时,它会保持堆栈还是堆?

时间:2016-03-19 23:00:24

标签: c

样品:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct Animal{

    char name[100];
    char color[100];

} Animal;

Animal Animal_new() {

    Animal aux;
    return aux;
}

int main() {

    Animal a = Animal_new();    

}

内部结构在堆栈处创建 返回是一个移动到堆的副本?
返回的结构必须是免费的吗?

3 个答案:

答案 0 :(得分:3)

返回结构的函数可以由编译器实现为获取额外的隐藏参数,指向调用者范围内的接收结构的指针,如果未存储结果,则可能是临时的。该函数将其本地副本复制到目标副本。在您的情况下,两者都存储在自动存储中。

如果你的函数已经从堆中为它返回的结构分配了内存,那么内存可能会变得无法访问,因为struct由值返回(复制到目标)及其地址,返回函数已知最终将失去。

如果结构很小,编译器可以选择将其作为标量值返回寄存器。

ABI定义了如何处理这些问题。 ABI是系统特定的,根据硬件功能和实现者的选择,它可以更简单。

答案 1 :(得分:1)

struct按值返回。事实上,任何事情进入堆的唯一方法就是致电malloc / calloc / realloc

Animal变量的本地值将放在自动内存中。当值返回到main时,会从aux Animal_new a main复制echo "line: $line" echo "fingerPrints:$i ${fingerPrints[$i]}" 31 + echo 'line: DCD0 5B71 EAB9 4199 527F 44AC DB6B 8C1F 96D8 BF6D' 32 + echo 'fingerPrints:1 DCD0 5B71 EAB9 4199 527F 44AC DB6B 8C1F 96D8 BF6D' 。然而,编译器可以以防止复制的方式优化事物,但是人们可能不会认为这是真的。

答案 2 :(得分:1)

调用函数在其堆栈上为被调用者的返回结构分配空间。

基本上,因为在你的例子中,main知道它将接收一个结构Animal它会自动在它的堆栈上为它创建空间并传递一个指针(这对你来说是隐藏的,但是在汇编级别发生)到这个新创建的堆栈空间到您的Animal_New()函数。

此函数在其堆栈空间中有自己的struct副本,返回时它通过收到的指针将其值复制到调用者堆栈空间。

@MoLaiSkirulais在评论中提问:

lapply

正如@Olaf所提到的那样,经典&#34;实现,应该代表大多数实现,但是当有疑问时,知道比假设更好阅读文档。