我有类似下面的C代码:
struct MyStruct MyFunction (something here)
{
struct MyStruct data;
//Some code here
return data;
}
返回的值是数据内存块的引用还是副本? MyFunction应该返回struct MyStruct *(带有相应的内存分配)而不是struct MyStruct吗?
答案 0 :(得分:6)
在C中没有引用这样的东西。从语义上讲,你将返回结构的副本。但是,编译器可能会对此进行优化。
您不能返回局部变量的地址,因为它在函数返回时超出范围。你可以返回你刚刚malloc
编辑的地址,但是你需要明确某个人在某个时候需要free
指针。
答案 1 :(得分:4)
它会返回一份副本。 C是一种按值传递的语言。除非您指定传递指针,否则将复制结构以进行赋值,返回语句以及用作函数参数。
答案 2 :(得分:1)
它作为副本返回。顺便说一下,你不应该返回它的引用,因为它有自动存储持续时间(即数据驻留在堆栈上)。
答案 3 :(得分:0)
我遇到了这个问题(DLL中返回结构的函数)并对其进行了调查。从DLL返回结构以供可能具有不同编译器的人使用不是好习惯,因为以下内容。
这是如何工作取决于实施。一些实现在寄存器中返回小记录,但是大多数实现获得一个不可见的额外参数,该参数指向调用者的本地帧中的结果结构。返回时,指针用于将数据复制到调用者的本地帧中的结构。如何传递此指针取决于实现:作为最后一个参数,作为第一个参数或作为寄存器。
正如其他人所说,返回引用并不是一个好主意,因为你返回的结构可能在你的本地框架中。我更喜欢那些根本不返回这些结构的函数,而是将指针指向一个并从函数内部填充它。