从C中的函数获取返回值

时间:2013-03-23 17:05:13

标签: c function pointers

考虑两个功能:

int add1(int x,int y)
{
return x+y;
}


void add2(int x,int y,int *sum)
{
*sum=x+y;
}

我通常使用add1形式的函数,但是我发现了一些使用add2形式函数的代码 即使大小返回值很大(如数组或结构),我们也可以返回它的ponter
我想知道是否有任何理由使用第二种形式?

6 个答案:

答案 0 :(得分:2)

还有退回成功状态的原因。

有很多功能,如:

bool f(int arg1, int arg2, int *ret)
{
}

bool(或enum)返回函数成功的位置。而不是检查if ret is null...(如果你有超过1个变量)。

答案 1 :(得分:1)

如果你想从函数中返回两个值,那么除非你像函数add2一样使用指针,否则C是无助的。

void add2()
{

 /* Some Code */

 *ptr1=Something;
 *ptr2=Something;
}

答案 2 :(得分:1)

表单2对于C中的“多次返回”非常常见。一个典型的例子是将地址返回缓冲区和缓冲区的长度:

/* Returns a buffer based on param. Returns -1 on failure, or 0 on success.
Buffer is returned in buf and buflen. */
int get_buffer(void *param, char **buf, int *buflen);

答案 3 :(得分:0)

当你使用像int这样小的东西时,表格2的功能并不比表格1的功能快。实际上,在这种情况下,第二个较慢,因为你必须取消引用传递的指针。如果您的目标是传递一系列值,那么它仅在这种情况下有用)

除非您想将非常大的数据传递给该函数,否则请始终使用表单1的函数。在这种情况下,表格2会更快。

我们使用第二种形式的原因是因为对于大型对象,我们希望避免复制它们。我们可以将内存地址传递给该函数,而不是复制。这是指针进入的地方。因此,不要给函数所有数据,而是告诉它这个数据。 (我希望这个比喻足够好)

答案 4 :(得分:0)

这在很大程度上取决于偏好和地方惯例。第二种形式可以与一堆其他类似的函数一起使用,其中每个函数中的第三个参数总是作为指向返回值的指针传递。

就个人而言,我喜欢几乎所有目的的第一种形式:它不需要传递指针,并且它允许在处理返回值时具有某种类型的灵活性。

答案 5 :(得分:0)

通过写入通过指针传递的内存来返回值是合理的,当返回的对象很大时,或者当函数的返回值用于其他目的时(例如,信令错误条件)。在您显示的代码中,这两个都不是这种情况,所以我会先进行实现。

从函数返回指针时,必须确保函数调用后指向的内存有效。这意味着,指针必须指向堆,从而在堆上进行必要的分配。这会给打电话者带来负担;他必须释放他没有明确分配的记忆。

相关问题