avertissement: la fonction retourne l’adresse de la variable locale

J’écris une fonction en C pour faire des calculs. et je veux que cela revienne comme une valeur de tableau à une autre fonction de cette façon.

455 calculated_val = calculation(value_perf); 358 int calculation(double* dataset){ 359 360 double calculated[8] = {}; 361 calculated[0] = dataset[7]/dataset[5]; 362 calculated[1] = (dataset[0] + dataset[1] + dataset[2] - dataset[3] - dataset[4])/(dataset[5]); 363 calculated[2] = dataset[3]/dataset[5]; 364 calculated[3] = dataset[6]/dataset[5]; 365 calculated[4] = dataset[8]/dataset[5]; 366 calculated[5] = dataset[9]/dataset[10]; 367 calculated[6] = dataset[11]/dataset[5]; 368 calculated[7] = dataset[12]/dataset[5]; 369 return calculated; 370 } 

Pendant que je le fais, j’obtiens les avertissements suivants et je ne les comprends pas.

 369:2: warning: return makes integer from pointer without a cast [enabled by default] 369:2: warning: function returns address of local variable [enabled by default] 

Y a-t-il quelque chose qui m’a manqué fondamentalement? S’il vous plaît donnez-moi des conseils / solutions.

 double calculated[8] 

Alloue de la mémoire sur la stack, qui sera déroulée lorsque la fonction retourne et n’est donc pas sûre pour la fonction appelante.

Au lieu de cela, utilisez

 double* calculated = malloc(8 * sizeof(double)); 

pour l’allouer sur le tas, qui peut ensuite être partagé dans votre programme.

modifier

Je ne suis pas sûr de ce qui était prévu par retourner un int. Pour retourner votre tas de calcul alloué de 8 doubles:

 #include "stdlib.h" // ... double* calculation(double* dataset){ double* calculated = (double*)malloc(8 * sizeof(double)); calculated[0] = dataset[7]/dataset[5]; // Other assignments ... return calculated; } 

Notez que votre code d’appel doit également être ajusté pour tenir compte du double* retour.

Selon le commentaire de Gauthier, la propriété du tableau alloué est transférée de la fonction de calcul à la fonction appelante, qui doit la libérer une fois qu’elle n’est plus nécessaire.

Vous pouvez prendre un paramètre supplémentaire où le résultat est renvoyé.

 void calculation(double* dataset, double * result) 

Et appelez la fonction comme ci-dessous

 calculation(value_perf, calculated_val); 

où Calcul_val est supposé être déclaré en tant que tableau double.

Pour faciliter l’utilisation de la valeur renvoyée dans une autre fonction de la même expression, vous pouvez renvoyer le même paramètre.

 double * calculation(double* dataset, double * result) { ... return result; } 

Tout d’abord, le type de retour de votre fonction est incorrect. Ce devrait probablement être un pointer to a double .

Deuxièmement, vous retournez l’adresse d’une variable locale qui est allouée sur la stack et dès que vous revenez de la fonction, cette variable sort de l’image et son adresse est similaire.

Donc, si vous voulez vraiment retourner l’adresse, vous devez utiliser:

 double* calculated = malloc(sizeof(double)*8);