我是一名学习过程序员的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中合法吗?你会选择一个而不是另一个.非常感谢你们!
第一个版本在堆栈上分配对象并返回它的副本.第二个版本在堆上创建对象并返回指向它的指针(除了不自动释放内存之外,它最接近Java引用).你不应该忘记free()稍后调用返回的指针.
顺便说一句,你的主要功能是糟糕的.它应该是
int main(void)
{
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我建议你读一本好的C书.这是你要问的基本内容.
第一个代码示例:
在堆栈的myfunction()中创建一个struct并返回它.然后,您创建另一个堆栈结构,并将第一个复制到第二个.第一个被摧毁.当你超出范围时,第二个将被自动销毁.
实际上创建了
2个结构.
第二个代码示例:
在myfunction()中创建一个结构,然后只复制地址.main中的struct实际上是相同的struct.
这里只创建了一个结构.
两个代码示例都有效,但是对于以后你必须显式释放为结构分配的内存,以避免内存泄漏,但性能应该更好,因为你不需要复制结构!
编辑:
正如@Mat所提到的:这当然忽略了malloc()的开销,而小结构则不然.