2015-02-23 174 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並將該地址傳遞給函數。