Ostrzeżenie: powrót z niezgodnego typu wskaźnika w C


Poniższy kod generuje niekompatybilny błąd typu wskaźnika i ostrzeżenie: kontrolka osiąga koniec funkcji non-void w funkcji filename:
#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; }
}

Jestem nowy w tej branży, czy ktoś może mi pomóc z tym błędem?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

No tak? Funkcja jest zadeklarowana jako powrót
char *
, ale zwracasz
i1
, który jest argumentem wejściowym i jest typu
int *
.
Możesz na myśli zwrócić nowo wybraną linię
dum
, a także ewentualnie wypełnić ją danymi, które zostały odczytane za pomocą
fgets ()
do oddzielnej
tablicy znaków wejściowych
. W takim przypadku musisz skopiować dane i zwrócić
dum
.
Byłoby to bardziej zwięzłe, prostsze i ogólnie lepiej czytane bezpośrednio w
dum
:
fgets(dum, 16, stdin);return dum;

Zauważ, że to powiela rozmiar bufora z wywołania
malloc ()
, czyli „zapach kodu”. Można to poprawić, ustawiając stałą lokalną w funkcji:
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;
}

Mój ostatni kod ma również tę zaletę, że sprawdza zwracane wartości funkcji, które mogą się nie powieść. Zarówno alokacja pamięci (
malloc ()
), jak i I/O (
fgets ()
) mogą się nie powieść, dlatego należy sprawdzić zwracane przez nie wartości.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oprócz tego, co zostało powiedziane podczas odprężania, musisz zwrócić coś po wierszu
printf ("Nie można zaalokować pamięci \ n");
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po pierwsze, twoja wyściółka jest okropna. Ponowne wyobrażenie sobie tego sprawia, że ​​jest trochę jaśniej, co się dzieje:
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; }
}

Więc w jednej ścieżce, jeśli zwrócisz „i1”, które jest wskaźnikiem int, który zdecydowanie nie jest wskaźnikiem znaku.
W drugiej połowie po prostu przechodzisz do końca funkcji, która nic nie zwraca.
Masz szczęście, że Twój kompilator ostrzega Cię o tym. Wielu domyślnie po prostu to ignoruje.
tak przy okazji, masz wyciek pamięci. Pobierasz pamięć dla dum, ale nigdy jej nie zwalniasz.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się