Come correggere gli specificatori della dichiarazione prevista di riallocazione o l'errore "..." prima di "sizeof"?
Dopo aver chiamato, ottengo il seguente errore di seguito realloc
void* realloc(sizeof(char)100);
L'errore:
linex.c: 23: 16: errore: specificatori di dichiarazione previsti o '...' prima di 'sizeof'
Per favore aiuto. Grazie. :)
Risposte
void realloc(sizeof(char)100);
Supponendo che tu intenda una chiamata alla realloc()
funzione standard (non una dichiarazione di personalizzazione realloc()
) e vuoi ridimensionare la memoria, questo codice è sbagliato riguardo a tre punti.
1.
realloc()
necessita di un puntatore alla memoria allocata da una gestione della memoria e non già liberato come primo argomento.
Questo è il prototipo / dichiarazione per la realloc()
funzione standard :
void *realloc( void *ptr, size_t new_size );
La tua realloc()
chiamata omette questo argomento del puntatore.
2.
Non specificare il tipo di ritorno (qui void *
) quando vuoi chiamare una funzione. Con questo si tenta di fare una nuova dichiarazione della funzione realloc()
e non una chiamata.
Se hai provato a fare un casting qui, anche questo è sbagliato. Per un cast implicito, è necessario racchiudere il tipo a cui eseguire il cast tra parentesi come (void *)
.
Si noti che in entrambi i casi il cast è ridondante. Con vista sul cast del tipo restituito, dai un'occhiata a:
- Lancio il risultato di malloc?
3.
All'argomento size è necessario l' *
operatore tra sizeof(char)
e 100
.
Uso:
realloc( ptr, sizeof(char) * 100 );
Tieni presente che dovresti sempre controllare il valore di ritorno delle funzioni di gestione della memoria indipendentemente dal fatto che si sia verificato o meno un errore:
char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
fputs("Error at resizing the allocated memory!\n", stderr);
// error routine.
}
Lo stesso che dovresti sempre fare per malloc()
:
char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
fputs("Error at memory allocation!\n", stderr);
// error routine.
}
Lezione avanzata (non è necessario capirlo a questo punto del tempo):
Nota che nel caso di realloc()
, utilizzo un puntatore diverso per catturare il valore restituito di realloc()
.
Questo perché realloc()
può o non può restituire lo stesso puntatore passato come argomento.
Una pratica purtroppo comune ma cattiva è riassegnare il puntatore passato come primo argomento dal valore di ritorno di realloc()
.
Questo è pericoloso poiché il riferimento alla memoria allocata per prima può essere perso se viene realloc()
assegnata un'altra memoria "sostitutiva" ma non viene cancellata la prima.
Relazionato:
- È una buona pratica di codifica assegnare l'indirizzo restituito da realloc () allo stesso puntatore?
- https://stackoverflow.com/a/25435175/12139179
- In che modo realloc () rialloca la memoria?
void* realloc(sizeof(char)*100);
è un miscuglio di dichiarare una funzione e chiamarla.
Quando dichiariamo una funzione, diciamo qual è il suo tipo di ritorno e quali tipi sono i suoi parametri, come in void *realloc(void *, size_t);
. Possiamo anche fornire nomi di segnaposto per i parametri come descrizioni utili, come in void *realloc(void *pointer, size_t size);
. (I nomi dei parametri sono richiesti quando si definisce completamente la funzione.)
Quando chiamiamo una funzione, non diamo nomi di tipo per il valore restituito o per i parametri. Forniamo solo espressioni che forniscono i valori degli argomenti, come in NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
.
A volte i nomi dei tipi possono apparire all'interno o vicino a una chiamata a una funzione, ma questi sono accidentali e non fanno parte direttamente della chiamata di funzione. Esempi sono:
char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
: Questo codice hachar *
perché dichiara e definisceNewPointer
. QuindiNewPointer
viene inizializzato con larealloc
chiamata.NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);
: Questo codice ha(char *)
come cast per convertire il valore restituitorealloc
in un tipo di puntatore specifico. Questo non è necessario in C.NewPointer = realloc(OldPointer, 100 * sizeof(char));
: Questo codice hachar *
come operandosizeof
per calcolare lo spazio necessario. Questo non è necessario perché la dimensione può essere presasizeof *NewPointer
, e questo è generalmente preferibile perché si adatta automaticamente ai cambiamenti nella dichiarazione diNewPointer
, riducendo la possibilità che un bug possa essere introdotto cambiando il tipo nella dichiarazione diNewPointer
ma trascurando l'sizeof
espressione.