假设我已将两个值传递给函数iCalculate(int x, int y)
,而此iCalculate
返回两个值。这些如下: -
现在我应该如何使用相同的函数同时返回上述两个值?
我的方法是: -
int* iCalculate(int x,int y){
int temp[2];
temp[0] = x*y;
temp[1] = x/y;
return temp;
}
答案 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, ")
您可以做的另一件事是将数据打包到结构
中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;
并返回该类型的对象。
(这是标准库函数div
和ldiv
的作用,除了它们以不同方式调用类型。)
答案 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);