warning:函数返回局部变量的地址

pis*_*tal 7 c linux gcc

我正在用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 }
Run Code Online (Sandbox Code Playgroud)

虽然,我这样做..我得到以下警告,我不明白.

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]
Run Code Online (Sandbox Code Playgroud)

从根本上是否有一些我错过的东西?请给我一些提示/解决方案.

Stu*_*tLC 14

double calculated[8]
Run Code Online (Sandbox Code Playgroud)

堆栈,这将是在分配内存展开时,函数返回,因而不能安全调用函数访问.

相反,使用

double* calculated = malloc(8 * sizeof(double));
Run Code Online (Sandbox Code Playgroud)

在堆上分配它,然后可以在您的程序中共享它.

编辑

我不确定返回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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的调用代码也需要调整以适应double*返回.

按照戈捷的评论,从"计算"调用函数,必须释放它一旦不再需要分配的阵列转移所有权.

  • 问题被标记为`C`,所以请求'malloc`而不是`new`. (3认同)
  • [请不要在C中转换`malloc()`的返回值(http://stackoverflow.com/a/605858/28169).另外,如果`dataset`是只读的,它应该是`const double*`. (3认同)
  • 并更改返回类型 (2认同)
  • 值得一提的是结果数组必须在应用程序中稍后释放!我相信最好在`calculate`函数之外定义结果数组**,并将指针传递给它`double*calculation(double*const result,const double*const dataset)`.您可能需要传递数组大小,但无论如何您似乎都要对它们进行硬编码. (2认同)