我在C中编写一个函数来进行一些计算。我希望以这种方式将其作为数组值返回给另一个函数。
455 calculated_val = calculation(value_perf);
358 int calculation(double* dataset){
359
360 double calculated[8] = {};
361 calculated[0] = dataset[7]/dataset[5];
362 calculated[1] = (dataset[0] + dataset[1] + dataset[2] - dataset[3] - dataset[4])/(dataset[5]);
363 calculated[2] = dataset[3]/dataset[5];
364 calculated[3] = dataset[6]/dataset[5];
365 calculated[4] = dataset[8]/dataset[5];
366 calculated[5] = dataset[9]/dataset[10];
367 calculated[6] = dataset[11]/dataset[5];
368 calculated[7] = dataset[12]/dataset[5];
369 return calculated;
370 }
虽然,我这样做..我得到以下警告,我不明白。
369:2: warning: return makes integer from pointer without a cast [enabled by default]
369:2: warning: function returns address of local variable [enabled by default]
我从根本上错过了什么吗?请给我一些提示/解决方案。
答案 0 :(得分:13)
double calculated[8]
在堆栈上分配内存,这将是unwound when the function returns,因此调用函数无法安全访问。
相反,请使用
double* calculated = malloc(8 * sizeof(double));
将它分配到堆上,然后可以在您的程序中共享。
编辑
我不确定返回int的意图是什么。要返回堆分配的8个双精度计算:
#include "stdlib.h"
// ...
double* calculation(double* dataset){
double* calculated = (double*)malloc(8 * sizeof(double));
calculated[0] = dataset[7]/dataset[5];
// Other assignments ...
return calculated;
}
请注意,您的调用代码也需要调整以适应double*
返回。
根据Gauthier的评论,分配数组的所有权从“计算”转移到调用函数,调用函数必须在不再需要时释放它。
答案 1 :(得分:1)
首先,您的函数的返回类型不正确。它应该是pointer to a double
。
其次,您将返回在堆栈上分配的局部变量的地址,并且一旦从函数返回,该变量就会从图片中移出,类似于它的地址。
所以,如果你真的想要返回地址,那么你应该使用:
double* calculated = malloc(sizeof(double)*8);
答案 2 :(得分:1)
您可以在返回结果的位置使用其他参数。
void calculation(double* dataset, double * result)
并调用以下函数
calculation(value_perf, calculated_val);
其中假定computed_val被声明为double数组。
为了方便在同一表达式中的另一个函数中使用返回值,可以返回相同的参数。
double * calculation(double* dataset, double * result)
{
...
return result;
}