我是一个学习C ++的java程序员,有一个关于函数的问题。这两者之间有什么区别:
main()
{
    struct person myperson;
    myperson = myfunction();
    return;
}
struct person myfunction()
{
     struct person myPerson;
     myPerson.firstname = "John";
     myPerson.lastname = "Doe";
     return myPerson;
}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;
}这些在C中是合法的吗?你会选择一个而不是其他。非常感谢大家!
发布于 2011-09-07 21:48:38
第一个代码示例:
在堆栈上的myfunction()中创建一个结构并返回它。然后,创建另一个堆栈结构,并将第一个堆栈结构到第二个堆栈结构。第一个是被摧毁的。当您超出范围时,第二个将被自动销毁。
实际创建的是2结构。
第二个代码示例:
在myfunction()中创建一个结构,然后只复制地址。main中的struct实际上是同一个struct。
这里只创建了一个结构体。
这两个代码示例都可以工作,但对于后一种情况,您必须显式地释放为结构分配的内存,以避免内存泄漏,但性能应该更好,因为您不需要复制结构!
编辑:
正如@Mat所提到的:这当然忽略了malloc()的开销,这对于小的结构是不正确的。
发布于 2011-09-07 21:47:42
第一个版本在堆栈上分配对象,并返回该对象的副本。第二个版本在Java堆上创建对象,并返回一个指向它的指针(除了内存不会自动释放之外,这与引用最接近)。您不应该忘记稍后在返回的指针上调用free()。
顺便说一句,你的main函数不好。它应该是
int main(void)
{    
    ...
    return 0;
}我建议你应该读一读a good C book。这是你要问的最基本的问题。
发布于 2011-09-07 21:55:45
我不确定所有这些关于“堆”和“栈”的讨论是否切入了语言的核心,所以让我尝试一些更具语言本质的东西。
您的第一个版本仅使用自动分配,这意味着所有变量都具有自动生存期。也就是说,所有变量在其封闭作用域的末尾结束其生命周期:myFunction创建一个struct person类型的局部变量并返回该变量的副本;main函数声明一个相同类型的局部变量,并将函数调用的结果赋给它。在每个作用域的末尾,局部变量也会结束。
第二个版本使用动态或手动分配。使用malloc()调用显式地为person变量分配存储空间,该存储空间将保持已分配状态,直到有人(通过free())解除分配。由于您从未释放它,这实际上是一个内存泄漏。
根本的区别是终生和责任的区别。
一些利弊:自动分配意味着责任是本地的,你通常不必担心任何事情。然而,它的代价是必须复制参数并按值返回值,这可能是昂贵的或不受欢迎的。手动分配允许您通过简单、廉价的指针引用大量内存,并且通常是实现某些构造的唯一方法,但需要让作者记住谁负责哪些资源。
https://stackoverflow.com/questions/7334891
复制相似问题