3 votes

Avertissement : retour d'un pointeur de type incompatible en C

Le code ci-dessous génère une erreur de type de pointeur incompatible et un avertissement : le contrôle atteint la fin d'une fonction non vide dans la fonction nom de fichier :

#include <stdio.h>
#include <stdlib.h>    

int quit;
char *filename(int *);

int main ()
{   
    filename(&quit);   
    return 0;
}

char *filename(int *i1)
{
    char input[16];
    char *dum=(char*)malloc(16*sizeof(char));    
    if (dum==NULL){
        printf("Memory could not be allocated \n");
    }
    else {
        printf("Memory was allocated – remember to free\n \n");    
        *i1=1;    
        fputs("Input filename = ", stdout);
        fflush(stdout);
        fgets(input,sizeof(input),stdin);    
        printf("Filename = \"%s\"\n",input);   
        return i1;

    }
}

Je suis novice en la matière, quelqu'un peut-il m'aider avec cette erreur ?

3voto

unwind Points 181987

Eh bien, oui ? La fonction est déclarée pour retourner char * mais vous revenez i1 qui est l'argument d'entrée et a le type int * .

Vous pourriez vouloir retourner la nouvelle chaîne allouée dum et peut-être aussi le remplir avec les données qui ont été lues à l'aide de fgets() au tableau de caractères séparé input . Dans ce cas, vous devez copier les données et renvoyer les données à l'adresse suivante dum .

Il serait plus concis, plus simple, et généralement mieux de lire directement dans dum :

fgets(dum, 16, stdin);

return dum;

Notez que cela duplique la taille du tampon de l'option malloc() ce qui constitue une "odeur de code". Cela peut être amélioré en en faisant une constante locale dans la fonction :

char * filename(void)
{
  const size_t max_fn = 16;
  char *dum;

  if((dum = malloc(max_fn)) != NULL)
  {
    if(fgets(dum, max_fn, stdin) != dum)
    {
      free(dum);  /* Input failed, free the buffer and drop the pointer. */
      dum = NULL;
    }
  }
  return dum;
}

Mon dernier code a également l'avantage de vérifier les valeurs de retour des fonctions qui peuvent échouer. L'allocation de mémoire ( malloc() ) et I/O ( fgets() ) peuvent échouer, vous devez donc vérifier leurs valeurs de retour.

1voto

Ed Heal Points 24309

En plus de ce que unwind a dit, vous devriez retourner quelque chose après la ligne printf("Memory could not be allocated \n");

1voto

Tom Tanner Points 4148

Eh bien, tout d'abord, votre indentation est épouvantable. Réindenter ceci rend un peu plus clair ce qui se passe :

char *filename(int *i1)
{
    char input[16];
    char *dum=(char*)malloc(16*sizeof(char));

    if (dum==NULL){
        printf("Memory could not be allocated \n");
    }
    else {
        printf("Memory was allocated – remember to free\n \n");

        *i1=1;

        fputs("Input filename = ", stdout);
        fflush(stdout);
        fgets(input,sizeof(input),stdin);

        printf("Filename = \"%s\"\n",input);

        return i1;

    }
}

Ainsi, dans un chemin du if, vous renvoyez 'i1' qui est un pointeur int, qui n'est certainement pas un pointeur char.

Dans l'autre moitié, il suffit d'aller jusqu'à la fin de la fonction, qui ne renvoie rien.

Vous avez de la chance que votre compilateur vous avertisse à ce sujet. Beaucoup, par défaut, l'ignorent.

En passant, vous avez une fuite de mémoire. Vous malloquez de la mémoire pour dum, mais ne la libérez jamais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X