warning:函数返回局部变量的地址[-Wreturn-local-addr]

时间:2015-02-23 17:22:44

标签: c

我在编译时遇到此错误,并在此处检查了其他问题而没有进一步的进展:

  

funciones.c:在函数'Lyapunov'中:../ funciones.c:55:2:警告:   函数返回局部变量的地址[-Wreturn-local-addr]
  return rgb;

首先,我打电话给'Lyapunov'在另一个.c: *请注意,在这个' .c'我只发布了调用Lyapunov的代码部分以及rgb的声明。

unsigned char rgb[3];

while((int)linea>inicial){                  
        for(col=0;col<asize;col++){             
               rgb = Lyapunov(col,linea);

               fwrite(rgb, 3, image);
        }
        linea++;
}

以及我收到警告的Lyapunov函数在这里:

#include "lyapunov.h"
#include <math.h>


#define CLAMP(x) (((x) > 255) ? 255 : ((x) < 0) ? 0 : (x))


unsigned char *Lyapunov(int ai, int bi){
    int n, m;
    double a, b, lambda, sum_log_deriv, prod_deriv, r, x, rgb_f[3];
    unsigned char rgb[3];   


    double lambda_min = -2.55;
    double lambda_max = 0.3959;

    a = amin + (amax-amin)/asize*(ai+0.5);
    b = bmin + (bmax-bmin)/bsize*(bi+0.5);
    x = 0.5;


        for (m = 0; m < seq_length; m++) {
            r = seq[m] ? b : a;
            x = r*x*(1-x);
        }

    sum_log_deriv = 0;
    for (n = 0; n < nmax; n++) {
        prod_deriv = 1;
        for (m = 0; m < seq_length; m++) {
                r = seq[m] ? b : a;

                prod_deriv *= r*(1-2*x); 
                x = r*x*(1-x);
        }
        sum_log_deriv += log(fabs(prod_deriv));
    }
    lambda = sum_log_deriv / (nmax*seq_length);

    if (lambda > 0) {
        rgb_f[2] = lambda/lambda_max;
        rgb_f[0] = rgb_f[1] = 0;
    } else {
        rgb_f[0] = 1 - pow(lambda/lambda_min, 2/3.0);
        rgb_f[1] = 1 - pow(lambda/lambda_min, 1/3.0);
        rgb_f[2] = 0;
    }


    rgb[0] = CLAMP(rgb_f[0]*255);
    rgb[1] = CLAMP(rgb_f[1]*255);
    rgb[2] = CLAMP(rgb_f[2]*255);

    return rgb;
}

我认为必须有某种类型的&#39; malloc&#39;但是我试图修复它的尝试是一场灾难。 先感谢您。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:2)

您可以按建议使用malloc,但查看代码更好的想法是将一个静态缓冲区传递给函数以获得它的结果(因为您只使用缓冲区一次,然后丢弃它的数据),这样功能签名将是:

void Lyapunov(int ai, int bi, unsigned char rgb[]);

然后在使用该函数之前,您需要定义缓冲区:

unsigned char rgb[3];

然后在你的循环中使用它

Lyapunov(col,linea, rgb);

这样您就不必担心任何内存泄漏(由函数产生)。

答案 1 :(得分:1)

unsigned char rgb[3];

是函数的本地函数,并且此数组的范围在函数Lyapunov内,因此一旦退出函数,此内存就不再有效。因此,您所获得的警告是正确的,它表示永远不会返回局部变量地址,这会在其范围之外使用时导致未定义的行为。

将内存分配给堆,然后返回指针,如下所示。

unsigned char *rgb = malloc(3);

答案 2 :(得分:1)

您尝试返回一个数组rgb,它停止在其本地范围之外的现有范围(也是该函数的范围),当您从函数返回时,它停止存在。数组不能返回数组。

您可以将数组放在结构中:

struct rgb_hold
{
    char rgb[3] ;
} ;

并返回结构,可以通过值返回。

答案 3 :(得分:1)

避免所有混乱的malloc / free调用等,在调用者中定义rgb并将地址传递给函数。