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ónfilename
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.
Bien, ¿sí? Se declara la función para volver
char *
, pero regresai1
que es el argumento de entrada y el tipo deint *
.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 lafgets()
el carácter independiente de la matriz deinput
. En este caso, usted necesita una copia de los datos, y volverdum
.Sería más conciso, más simple, y generalmente mejor para leer directamente en
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: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.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");
Bien, en primer lugar, su sangría es terrible. Reindenting esto hace que sea un poco más clara de lo que está pasando:
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.