函数如何在不使用malloc的情况下返回结构?

函数如何在不使用malloc的情况下返回结构?,c,struct,return-value,allocation,C,Struct,Return Value,Allocation,我不熟悉C,只是一个关于返回结构的问题。我听到有人说可以返回一个struct。例如: struct MyObj{ int x,y,z; }; struct MyObj foo(){ struct MyObj foo_a; foo_a.x = 10; foo_a.y = 10; foo_a.z = 10; return foo_a; } int main () { struct MyObj main_a = foo();

我不熟悉C,只是一个关于返回结构的问题。我听到有人说可以返回一个struct。例如:

struct MyObj{
   int x,y,z;
};

struct MyObj foo(){
    struct MyObj foo_a;
    foo_a.x = 10;
    foo_a.y = 10;
    foo_a.z = 10;

    return foo_a;
}        

int main () {
    struct MyObj main_a = foo();
    return 0;
} 
我的问题是:


foo\u a
foo
的堆栈中,因此在
foo
完成后,堆栈将被取消,这意味着
foo\u a
实际上不存在于
main
函数的堆栈中,
main
持有的指针
main\u a
实际上是非法指针,那么它将如何工作呢?

实现这一点的一种常见方法是调用例程为结构分配一些空间,通常在堆栈上,并向被调用例程传递指向该空间的指针。此参数在C源代码中不可见,它是汇编语言中如何调用例程的调用约定的一部分。然后被调用的例程简单地将结构的内容存储在指向的空间中

换言之,代码的实现在很大程度上就好像它是被编写的一样:

void foo(struct MyObj *temporary){
    struct MyObj foo_a;
    foo_a.x = 10;
    foo_a.y = 10;
    foo_a.z = 10;
    *temporary = foo_a;
}        

int main () {
    struct MyObj temporary;
    foo(&temporary);
    struct MyObj main_a = temporary;
    return 0;
} 

如果结构很小,可以在一个或几个寄存器中返回。被调用例程和调用例程都将使用相同的调用约定,这将有关于哪些结构在寄存器中返回,哪些通过调用方提供的指针返回的规则。

实现这一点的常见方法是调用例程为结构分配一些空间,通常在堆栈上,并向被调用的例程传递指向该空间的指针。此参数在C源代码中不可见,它是汇编语言中如何调用例程的调用约定的一部分。然后被调用的例程简单地将结构的内容存储在指向的空间中

换言之,代码的实现在很大程度上就好像它是被编写的一样:

void foo(struct MyObj *temporary){
    struct MyObj foo_a;
    foo_a.x = 10;
    foo_a.y = 10;
    foo_a.z = 10;
    *temporary = foo_a;
}        

int main () {
    struct MyObj temporary;
    foo(&temporary);
    struct MyObj main_a = temporary;
    return 0;
} 

如果结构很小,可以在一个或几个寄存器中返回。被调用例程和调用例程都将使用相同的调用约定,这将有关于哪些结构在寄存器中返回,哪些通过调用方提供的指针返回的规则。

main holds实际上是非法指针,但没有指针
main\u a
不是一个点返回局部变量的副本是可以的-您一直在使用返回
int
的函数。不正常的是试图返回一个指向局部变量的指针;指针的副本返回正常,但它指向的数据不再存在,从而导致问题。@JonathanLeffler是的,我知道,这就是为什么我问为什么人们说不使用malloc返回结构是可以的,因为您返回的是结构的副本,而不是指向结构的指针。就像你返回一个
int
,而不是指向
int
@JonathanLeffler的指针一样抱歉,我没有得到它,你是说
foo
函数通过在
main
方法的堆栈中写入
main\u a
所在的值来返回结构的副本吗?
main holds实际上是非法指针,但没有指针
main\u a
不是一个点返回局部变量的副本是可以的-您一直在使用返回
int
的函数。不正常的是试图返回一个指向局部变量的指针;指针的副本返回正常,但它指向的数据不再存在,从而导致问题。@JonathanLeffler是的,我知道,这就是为什么我问为什么人们说不使用malloc返回结构是可以的,因为您返回的是结构的副本,而不是指向结构的指针。就像你返回一个
int
的副本,而不是指向
int
@JonathanLeffler的指针对不起,我不明白,你是说
foo
函数通过在
main
方法的堆栈中写入
main\u a
所在的值来返回一个结构副本吗?对不起,仍然没有得到它,
struct MyObj a只存在于
foo
的堆栈中,一旦foo完成,它的堆栈也就不存在了,所以
main\u a
指向的是不存在的东西?我想你遇到的困难是
main\u a
不是指针。将代码中的语句
return foo_a
视为对结构中的所有字段执行复制操作。它没有为结构分配指针。很抱歉,仍然无法获取它,
struct MyObj a只存在于
foo
的堆栈中,一旦foo完成,它的堆栈也就不存在了,所以
main\u a
指向的是不存在的东西?我想你遇到的困难是
main\u a
不是指针。将代码中的语句
return foo_a
视为对结构中的所有字段执行复制操作。它不是为结构分配指针。