El siguiente código genera un incompatibles puntero del tipo de error y advertencia: el control llega a fin de no anular la función en el archivo de la función:

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

    }
}

Soy nuevo en esto, alguien me puede ayudar con este error?

  • Su main llamadas de función filename sin necesidad de utilizar el valor de retorno, entonces, ¿por qué la función de la necesidad de devolver nada?
  • En realidad, la pregunta debería ser: ¿por qué no main utilizar el valor de retorno? Imprimir «recordar libre», pero que nunca se libre de ella.

3 Comentarios

  1. 3

    Bien, ¿sí? Se declara la función para volver char *, pero regresa i1 que es el argumento de entrada y el tipo de int *.

    Que podría significar para devolver el recién asignado cadena dum, y tal vez también a llenar con los datos que fue leído utilizando la fgets() el carácter independiente de la matriz de input. En este caso, usted necesita una copia de los datos, y volver dum.

    Sería más conciso, más simple, y generalmente mejor para leer directamente en dum:

    fgets(dum, 16, stdin);
    
    return dum;

    Tenga en cuenta que esto duplica el tamaño del búfer de la malloc() llamada, que es un «código de olor». Esto puede ser mejorado por lo que es una constante local en la función:

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

    Mi último código también tiene la ventaja de que las comprobaciones de valores de retorno de funciones que pueden fallar. Tanto la asignación de memoria (malloc()) y I/O (fgets()) puede fallar, así que usted debe comprobar sus valores de retorno.

    • Muchas gracias, como dije, soy nuevo en esto y tu comentario ha ayudado un montón 🙂
  2. 1

    Además de lo que descansar se ha dicho usted debe devolver algo después de la línea printf("Memory could not be allocated \n");

  3. 1

    Bien, en primer lugar, su sangría es terrible. Reindenting esto hace que sea un poco más clara de lo que está pasando:

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

    Así en una ruta de acceso de la si, el regreso ‘i1’, que es un int puntero, que definitivamente no es un puntero char.

    La otra mitad, que acaba de soltar hasta el final de la función, que devuelve nada.

    Tienes la suerte de su compilador advierte acerca de este. Mucho, por defecto, simplemente ignorarlo.

    como un aparte, usted tiene una pérdida de memoria. Usted malloc memoria para dum, pero nunca libre de ella.

Dejar respuesta

Please enter your comment!
Please enter your name here