【发布时间】:2016-08-20 17:06:21
【问题描述】:
我知道在 C 语言中,我们不能从函数返回数组,而是返回指向数组的指针。但我想知道structs 有什么特别之处,即使它们可能包含数组,它们也可以通过函数返回。
为什么struct 包装使以下程序有效?
#include <stdio.h>
struct data {
char buf[256];
};
struct data Foo(const char *buf);
int main(void)
{
struct data obj;
obj = Foo("This is a sentence.");
printf("%s\n", obj.buf);
return 0;
}
struct data Foo(const char *buf)
{
struct data X;
strcpy(X.buf, buf);
return X;
}
【问题讨论】:
-
你可以用
union做同样的事情。工会有什么特别之处? -
你应该问为什么数组在 C 中如此奇怪。
-
当返回一个结构时,如果结构不适合几个寄存器,那么编译器分配的“隐藏”内存,结构被复制(通过 memcpy())到隐藏然后将内存再次复制(通过 memcpy())到调用者的结构变量。所有其他功能都丢失了“隐藏”的记忆。对
memcpy()的两次额外调用和“隐藏”内存的丢失是结构不应为passed to或returned from函数的主要原因。最好的策略是传递一个指向结构的指针。 -
三个答案都没有解决结构的传递问题(而是他们只讨论传递数组),但他们没有回答这个问题。
-
@user3629249 - 不可能回答这个问题,因为这个问题的前提是缺乏理解。回答这个问题的唯一方法是尝试解释为什么不能问这个问题。想象一下,如果我问你“为什么蓝色和红色的颜色相同?”你会很快解释为什么你不能回答这个问题。
标签: c arrays struct return return-value