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

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

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

首先,我在另一个.c中调用’Lyapunov’函数:*请注意,在这个’.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  #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  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’,但我尝试修复它的尝试是一场灾难。 先感谢您。 任何帮助表示赞赏。

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

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

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

 unsigned char rgb[3]; 

然后在你的循环中使用它

 Lyapunov(col,linea, rgb); 

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

 unsigned char rgb[3]; 

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

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

 unsigned char *rgb = malloc(3); 

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

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

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

 struct rgb_hold { char rgb[3] ; } ; 

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