7

我正在用 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]

我从根本上错过了什么吗?请给我一些提示/解决方案。

4

3 回答 3

14
double calculated[8]

在堆栈上分配内存,当函数返回时将被解除,因此调用函数访问时不安全。

相反,使用

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 的评论,分配数组的所有权从“计算”转移到调用函数,一旦不再需要它就必须释放它。

于 2013-09-18T07:17:10.457 回答
1

首先,您的函数的返回类型不正确。它应该是一个pointer to a double.

其次,您正在返回分配在堆栈上的局部变量的地址,并且一旦您从函数返回,该变量就会从图片中消失,同样它是地址。

所以,如果你真的想返回地址,那么你应该使用:

double* calculated = malloc(sizeof(double)*8);
于 2013-09-18T07:18:01.020 回答
1

您可以在返回结果的位置采用附加参数。

void calculation(double* dataset, double * result)

并调用如下函数

calculation(value_perf, calculated_val);

其中 computed_val 假定被声明为双精度数组。

为了方便在同一个表达式的另一个函数中使用返回值,可以返回相同的参数。

double * calculation(double* dataset, double * result)
{
    ...
    return result;
}
于 2013-09-18T07:20:27.210 回答