如何从函数返回两个值?

时间:2011-07-16 11:26:55

标签: c function

  

可能重复:
  returning multiple values from a function

假设我已将两个值传递给函数iCalculate(int x, int y),而此iCalculate返回两个值。这些如下: -

  • (X * Y)
  • (X / Y)

现在我应该如何使用相同的函数同时返回上述两个值?

我的方法是: -

int* iCalculate(int x,int y){
   int temp[2];
   temp[0] = x*y;
   temp[1] = x/y;
   return temp;
}

5 个答案:

答案 0 :(得分:29)

返回本地数组的第一个元素的地址具有未定义的行为(至少在以后取消引用它)。

您可以使用输出参数,即传递两个指针,并设置

中的值
void Calculate(int x, int y, int* prod, int* quot)
{
    *prod = x*y;
    *quot = x/y;
}

用法:

int x = 10,y = 2, prod, quot;
Calculate(x, y, &prod, &quot)

您可以做的另一件事是将数据打包到结构

typedef struct 
{
    int prod;
    int quot;
} product_and_quot;


product_and_quot Calculate(int x, int y)
{
    product_and_quot p = {x*y, x/y};
    return p;
}

答案 1 :(得分:11)

这不起作用,因为你正在返回一个临时数组的指针,它会在函数返回时停止存在。

相反,定义

typedef struct { int first, second; } IntPair;

并返回该类型的对象。

(这是标准库函数divldiv的作用,除了它们以不同方式调用类型。)

答案 2 :(得分:2)

您的方法有误,temp超出范围/当功能iCalculate退出时不再存在。因此,您不得返回temp的地址。这将是超出范围/不再存在变量的地址。访问该地址意味着未定义的行为。

您可以使用此方法:

void iCalculate(int x,int y,int *mult,int *divi){
   *mult = x*y;
   *divi = x/y;
}

或者您可以使用其他方法:

typedef struct{ 
   int mul, divi;
} TResult;

TResult iCalculate(int x,int y){
   TResult res;
   res.mul = x*y;
   res.divi = x/y;
   return res;
}

或:

void iCalculate(int x,int y,TResult *res){
   res->mul = x*y;
   res->divi = x/y;
}

我建议采用第一种方法。我认为创建一个新的结构定义只是为了将2个不相关的值包装在一起太愚蠢了。

答案 3 :(得分:1)

你做的方式是错误的,因为一旦函数返回int temp[2]消失,所以调用者有一个“悬空”指针。您必须添加static。另一种可能更好的方法是让调用者通过它想要存储结果的地方,例如。

void iCalc(int x, int y, int *rp, int *rq)
{
   // check if rp and rq are NULL, if so, returns
   *rp = x*y;
   *rq = x/y; // y != 0, and this will truncate of course.
}

并且调用者将执行类似

的操作
int res[2];
iCalc(x, y, res, res+1);

或类似。

答案 4 :(得分:1)

你的方法并没有错,你可以像这样返回表的地址:

int *iCalculate(int x,int y){
    int *temp=malloc(sizeof(int)*2);
    temp[0]=x*y;
    temp[1]=x/y;
    return temp;
}

不要忘记释放记忆:

int *result;
result=iCalculate(10,7);
printf("%d %d\n",result[0],result[1]);
free(result);