首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于C语言中返回函数的问题

关于C语言中返回函数的问题
EN

Stack Overflow用户
提问于 2011-09-07 21:43:55
回答 10查看 384关注 0票数 10

我是一个学习C ++的java程序员,有一个关于函数的问题。这两者之间有什么区别:

代码语言:javascript
运行
复制
main()
{
    struct person myperson;

    myperson = myfunction();

    return;
}

struct person myfunction()
{
     struct person myPerson;
     myPerson.firstname = "John";
     myPerson.lastname = "Doe";
     return myPerson;
}

VS

代码语言:javascript
运行
复制
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中是合法的吗?你会选择一个而不是其他。非常感谢大家!

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-09-07 21:48:38

第一个代码示例:

在堆栈上的myfunction()中创建一个结构并返回它。然后,创建另一个堆栈结构,并将第一个堆栈结构到第二个堆栈结构。第一个是被摧毁的。当您超出范围时,第二个将被自动销毁。

实际创建的是2结构

第二个代码示例:

在myfunction()中创建一个结构,然后只复制地址。main中的struct实际上是同一个struct。

这里只创建了一个结构体。

这两个代码示例都可以工作,但对于后一种情况,您必须显式地释放为结构分配的内存,以避免内存泄漏,但性能应该更好,因为您不需要复制结构!

编辑:

正如@Mat所提到的:这当然忽略了malloc()的开销,这对于小的结构是不正确的。

票数 7
EN

Stack Overflow用户

发布于 2011-09-07 21:47:42

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

顺便说一句,你的main函数不好。它应该是

代码语言:javascript
运行
复制
int main(void)
{    
    ...
    return 0;
}

我建议你应该读一读a good C book。这是你要问的最基本的问题。

票数 7
EN

Stack Overflow用户

发布于 2011-09-07 21:55:45

我不确定所有这些关于“堆”和“栈”的讨论是否切入了语言的核心,所以让我尝试一些更具语言本质的东西。

您的第一个版本仅使用自动分配,这意味着所有变量都具有自动生存期。也就是说,所有变量在其封闭作用域的末尾结束其生命周期:myFunction创建一个struct person类型的局部变量并返回该变量的副本;main函数声明一个相同类型的局部变量,并将函数调用的结果赋给它。在每个作用域的末尾,局部变量也会结束。

第二个版本使用动态或手动分配。使用malloc()调用显式地为person变量分配存储空间,该存储空间将保持已分配状态,直到有人(通过free())解除分配。由于您从未释放它,这实际上是一个内存泄漏。

根本的区别是终生和责任的区别。

一些利弊:自动分配意味着责任是本地的,你通常不必担心任何事情。然而,它的代价是必须复制参数并按值返回值,这可能是昂贵的或不受欢迎的。手动分配允许您通过简单、廉价的指针引用大量内存,并且通常是实现某些构造的唯一方法,但需要让作者记住谁负责哪些资源。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7334891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档