在c函数中返回struct

时间:2011-07-29 00:03:17

标签: c pointers struct

我有类似下面的C代码:

struct MyStruct MyFunction (something here)
{
    struct MyStruct data;

    //Some code here

    return data;
}

返回的值是数据内存块的引用还是副本? MyFunction应该返回struct MyStruct *(带有相应的内存分配)而不是struct MyStruct吗?

4 个答案:

答案 0 :(得分:6)

在C中没有引用这样的东西。从语义上讲,你将返回结构的副本。但是,编译器可能会对此进行优化。

您不能返回局部变量的地址,因为它在函数返回时超出范围。你可以返回你刚刚malloc编辑的地址,但是你需要明确某个人在某个时候需要free指针。

答案 1 :(得分:4)

它会返回一份副本。 C是一种按值传递的语言。除非您指定传递指针,否则将复制结构以进行赋值,返回语句以及用作函数参数。

答案 2 :(得分:1)

它作为副本返回。顺便说一下,你不应该返回它的引用,因为它有自动存储持续时间(即数据驻留在堆栈上)。

答案 3 :(得分:0)

我遇到了这个问题(DLL中返回结构的函数)并对其进行了调查。从DLL返回结构以供可能具有不同编译器的人使用不是好习惯,因为以下内容。

这是如何工作取决于实施。一些实现在寄存器中返回小记录,但是大多数实现获得一个不可见的额外参数,该参数指向调用者的本地帧中的结果结构。返回时,指针用于将数据复制到调用者的本地帧中的结构。如何传递此指针取决于实现:作为最后一个参数,作为第一个参数或作为寄存器。

正如其他人所说,返回引用并不是一个好主意,因为你返回的结构可能在你的本地框架中。我更喜欢那些根本不返回这些结构的函数,而是将指针指向一个并从函数内部填充它。