advertencia: la función devuelve la dirección de la variable local

Recibo este error al comstackr y he comprobado otras preguntas aquí sin más progreso:

funciones.c: en la función ‘Lyapunov’: ../funciones.c:55:2: advertencia: la función devuelve la dirección de la variable local [-Wreturn-local-addr]
devuelve rgb;

En primer lugar, llamo a la función ‘Lyapunov’ aquí en otro .c: * Tenga en cuenta que en este ‘.c’ solo he publicado la parte del código donde se llama a Lyapunov y también la statement de rgb.

unsigned char rgb[3]; while((int)linea>inicial){ for(col=0;col<asize;col++){ rgb = Lyapunov(col,linea); fwrite(rgb, 3, image); } linea++; } 

y la función Lyapunov de donde recibo la advertencia está aquí:

 #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; } 

Supongo que debe haber algún tipo de ‘malloc’ pero mis bashs por solucionarlo han sido un desastre. Gracias de antemano. Cualquier ayuda es apreciada.

Puede usar malloc como se sugiere, pero ver su código sería mejor tener un solo búfer estático pasado a una función para obtener su resultado (ya que está usando el búfer solo una vez y luego descartando sus datos), de modo que La firma de la función será:

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

Luego, antes del uso de la función, deberá definir el búfer:

 unsigned char rgb[3]; 

y luego usarlo en su bucle

 Lyapunov(col,linea, rgb); 

De esta manera, no tendrá que preocuparse por ninguna pérdida de memoria (resultante de la función).

 unsigned char rgb[3]; 

es local para la función y el scope de esta matriz está dentro de la función Lyapunov por lo que una vez que salga de la función, esta memoria ya no es válida. Por lo tanto, la advertencia que está recibiendo es la correcta que dice que nunca devuelva la dirección de las variables locales, lo que conducirá a un comportamiento indefinido cuando se utilice fuera de su scope.

Tenga su memoria asignada al montón y luego devuelva el puntero como se muestra a continuación.

 unsigned char *rgb = malloc(3); 

para evitar todas las llamadas malintencionadas / libres, etc., defina el rgb en la persona que llama y pase la dirección a la función.

Está intentando devolver una matriz rgb que deja de existir fuera de su ámbito local (también el scope de la función), que deja de existir cuando regresa de la función. Las matrices no se pueden devolver por valor.

Puedes poner la matriz en una estructura:

 struct rgb_hold { char rgb[3] ; } ; 

y devolver la estructura, que puede ser devuelta por valor.