样品:
#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();
}
内部结构在堆栈处创建
返回是一个移动到堆的副本?
返回的结构必须是免费的吗?
答案 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;实现,应该代表大多数实现,但是当有疑问时,知道比假设更好阅读文档。