Come correggere gli specificatori della dichiarazione prevista di riallocazione o l'errore "..." prima di "sizeof"?

Aug 15 2020

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

1 RobertSsupportsMonicaCellio Aug 15 2020 at 15:42
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?
1 EricPostpischil Aug 15 2020 at 17:35

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 ha char *perché dichiara e definisce NewPointer. Quindi NewPointerviene inizializzato con la reallocchiamata.
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);: Questo codice ha (char *)come cast per convertire il valore restituito reallocin un tipo di puntatore specifico. Questo non è necessario in C.
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));: Questo codice ha char *come operando sizeofper calcolare lo spazio necessario. Questo non è necessario perché la dimensione può essere presa sizeof *NewPointer, e questo è generalmente preferibile perché si adatta automaticamente ai cambiamenti nella dichiarazione di NewPointer, riducendo la possibilità che un bug possa essere introdotto cambiando il tipo nella dichiarazione di NewPointerma trascurando l' sizeofespressione.