2015-02-23 166 views
0

我没有进一步的进展这里编译和已签出其他问题时出现此错误:警告:函数返回局部变量的地址[-Wreturn-本地地址]

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

首先,我在这里所说的“李雅普诺夫函数在其他的.c: *请注意,在这个“.C”我只贴码的一部分,其中李雅普诺夫被调用,也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; 
} 

我认为必须有某种“的malloc”,但我的努力试图修复它是一个灾难。 预先感谢您。任何帮助表示赞赏。

+2

重复数百次以上。 – 2015-02-23 17:23:46

+2

[警告C4172:返回本地变量或临时地址]的可能的重复(http://stackoverflow.com/questions/3740151/warning-c4172-returning-address-of-local-variable-or-temporary) – 2015-02-23 17:24:39

+0

你'试着返回'rgb',它是一个本地数组,当你返回时它将超出范围。 – 2015-02-23 17:24:48

回答

1
unsigned char rgb[3]; 

是局部的作用,这阵的范围是函数Lyapunov内,所以一旦你退出功能这款内存不再有效。所以你得到的警告是正确的,它说永远不会返回局部变量地址,当它在范围外使用时会导致未定义的行为。

让您的内存分配堆,然后返回指针,如下所示。

unsigned char *rgb = malloc(3); 
+0

由于函数在循环中使用,因此每次迭代释放它都是一个好主意。 – 2015-02-23 17:34:20

+0

使用动态内存分配有点重量级,并要求调用者“知道”返回的内存必须是空闲的。更好的方法是调用者将所需的缓冲区传递给函数,并根据需要分配/声明它。 – Clifford 2015-02-23 18:23:48

1

你试图返回其停止(功能也范围内)的本地范围内的现有外,当你从函数返回其停止现有的阵列rgb。数组不能由数值返回。

您可以将阵列的结构:

struct rgb_hold 
{ 
    char rgb[3] ; 
} ; 

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

+0

返回除基本数据类型和指针外总是一个坏主意 – user3629249 2015-02-23 17:43:53

+0

代码不是“返回一个数组'rgb'”--OP只是希望这样做。 'unsigned char * Lyapunov()'返回一个指向'unsigned char'的指针。然而,返回结构是一种有效的方法。 +1 – chux 2015-02-23 18:07:15

+1

@ user3629249:“总是”有点强。也许还需要建议。在这种情况下,返回的对象的大小小于“double”的大小。 – Clifford 2015-02-23 18:21:08

2

你可以像建议的那样使用malloc,但是看看你的代码更好的想法是将一个静态缓冲区传递给一个函数来得到它的结果(因为你只使用一次缓冲区,然后丢弃它的数据) ,使得该函数签名是:

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

然后之前使用的功能,您将需要定义缓冲区:

unsigned char rgb[3]; 

,然后在你的循环使用

Lyapunov(col,linea, rgb); 

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

+0

这绝对是最明智的。我不知道为什么我对内存处理这么盲目。谢谢。 – Jason 2015-02-23 21:44:48

1

为了避免所有麻烦的malloc /免费电话等,在调用者中定义rgb并将该地址传递给函数。