关于C中的返回函数的问题

Jas*_*eef 10 c struct

我是一名学习过程序员的java程序员.有一个问题归档功能.这有什么区别:

main()
{
    struct person myperson;

    myperson = myfunction();

    return;
}

struct person myfunction()
{
     struct person myPerson;
     myPerson.firstname = "John";
     myPerson.lastname = "Doe";
     return myPerson;
}
Run Code Online (Sandbox Code Playgroud)

VS

main()
{
    struct person *myperson;

    myperson = myfunction();

    return;
}

struct person* myfunction()
{
     struct person *myPerson;
     myPerson = malloc(sizeof(struct person));
     myPerson->firstname = "John";
     myPerson->lastname = "Doe";
     return myPerson;
}
Run Code Online (Sandbox Code Playgroud)

这些在C中合法吗?你会选择一个而不是另一个.非常感谢你们!

Arm*_*yan 7

第一个版本在堆栈上分配对象并返回它的副本.第二个版本在堆上创建对象并返回指向它的指针(除了不自动释放内存之外,它最接近Java引用).你不应该忘记free()稍后调用返回的指针.

顺便说一句,你的主要功能是糟糕的.它应该是

int main(void)
{    
    ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我建议你读一本好的C书.这是你要问的基本内容.

  • `main`应该是`int main(void)`或`int main(int argc,char**argv)`来提供参数列表并且是标准C. (2认同)

ami*_*mit 7

第一个代码示例:
在堆栈的myfunction()中创建一个struct并返回它.然后,您创建另一个堆栈结构,并将第一个复制到第二个.第一个被摧毁.当你超出范围时,第二个将被自动销毁. 实际上创建了
2个结构.

第二个代码示例:
在myfunction()中创建一个结构,然后只复制地址.main中的struct实际上是相同的struct.
这里只创建了一个结构.

两个代码示例都有效,但是对于以后你必须显式释放为结构分配的内存,以避免内存泄漏,但性能应该更好,因为你不需要复制结构!

编辑:
正如@Mat所提到的:这当然忽略了malloc()的开销,而小结构则不然.

  • "但表现应该更好".不要低估`malloc`的开销.如果struct只有两个指针,那么副本可能比函数调用快. (5认同)