Wie kann man erwartete Deklarationsspezifizierer oder '…' vor dem 'sizeof'-Fehler neu zuordnen?

Aug 15 2020

Nach dem Anruf wird folgende Fehlermeldung angezeigt realloc

void* realloc(sizeof(char)100);

Der Fehler:

linex.c: 23: 16: Fehler: erwartete Deklarationsspezifizierer oder '...' vor 'sizeof'

Bitte helfen Sie. Vielen Dank. :) :)

Antworten

1 RobertSsupportsMonicaCellio Aug 15 2020 at 15:42
void realloc(sizeof(char)100);

Angenommen, Sie meinen einen Aufruf der Standardfunktion realloc()(keine Deklaration einer benutzerdefinierten Funktion realloc()) und möchten die Größe des Speichers ändern, ist dieser Code in Bezug auf drei Punkte falsch.

1.

realloc() benötigt einen Zeiger auf Speicher, der von einer Speicherverwaltung zugewiesen und nicht bereits als erstes Argument freigegeben wurde.

Dies ist der Prototyp / die Deklaration für die Standardfunktion realloc():

void *realloc( void *ptr, size_t new_size );

Ihr realloc()Aufruf lässt dieses Zeigerargument aus.

2.

Geben Sie nicht den Rückgabetyp (hier void *) an, wenn Sie eine Funktion aufrufen möchten. Damit versuchen Sie eine neue Deklaration der Funktion realloc()und keinen Aufruf.

Wenn Sie versucht haben, hier ein Casting durchzuführen, ist dies ebenfalls falsch. Für eine implizite Umwandlung müssen Sie den Typ, in den umgewandelt werden soll, durch Klammern wie umgeben (void *).

Beachten Sie, dass in beiden Fällen die Besetzung redundant ist. Schauen Sie sich mit Blick auf die Besetzung des Rückgabetyps Folgendes an:

  • Werfe ich das Ergebnis von Malloc?

3.

Beim Größenargument benötigen Sie den *Operator zwischen sizeof(char)und 100.


Verwenden:

realloc( ptr, sizeof(char) * 100 );

Beachten Sie, dass Sie auch immer den Rückgabewert von Speicherverwaltungsfunktionen überprüfen sollten, ob ein Fehler aufgetreten ist oder nicht:

char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
    fputs("Error at resizing the allocated memory!\n", stderr);
    // error routine.
}

Das gleiche sollten Sie immer tun für malloc():

char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
    fputs("Error at memory allocation!\n", stderr);
    // error routine.
}

Fortgeschrittene Lektion (Sie müssen sie zu diesem Zeitpunkt noch nicht verstehen):

Beachten Sie, dass realloc()ich im Fall von einen anderen Zeiger verwende, um den Rückgabewert von abzufangen realloc().

Dies liegt daran, dass realloc()möglicherweise derselbe Zeiger zurückgegeben wird, der als Argument übergeben wurde.

Eine leider übliche, aber schlechte Praxis besteht darin, den als erstes Argument übergebenen Zeiger durch den Rückgabewert von neu zuzuweisen realloc().

Dies ist gefährlich, da der Verweis auf den zuerst zugewiesenen Speicher dann verloren gehen kann, wenn ein realloc()anderer "Ersatz" -Speicher zugewiesen wird, der erste jedoch nicht gelöscht wird.

Verbunden:

  • Ist es eine gute Codierungspraxis, die von realloc () zurückgegebene Adresse demselben Zeiger zuzuweisen?
  • https://stackoverflow.com/a/25435175/12139179
  • Wie ordnet realloc () den Speicher neu zu?
1 EricPostpischil Aug 15 2020 at 17:35

void* realloc(sizeof(char)*100); ist ein Mischmasch, eine Funktion zu deklarieren und aufzurufen.

Wenn wir eine Funktion deklarieren , sagen wir, wie ihr Rückgabetyp ist und welche Typen ihre Parameter sind, wie in void *realloc(void *, size_t);. Wir können auch Platzhalternamen für die Parameter als hilfreiche Beschreibungen bereitstellen, wie in void *realloc(void *pointer, size_t size);. (Parameternamen sind erforderlich, um die Funktion vollständig zu definieren.)

Wenn wir eine Funktion aufrufen , geben wir keine Typnamen für den Rückgabewert oder die Parameter an. Wir geben nur Ausdrücke an, die die Argumentwerte liefern, wie in NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);.

Manchmal können Typnamen in oder in der Nähe eines Funktionsaufrufs erscheinen, diese sind jedoch zufällig und nicht direkt Teil des Funktionsaufrufs. Beispiele sind:

  • char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);: Dieser Code hat, char *weil er deklariert und definiert NewPointer. Dann NewPointerwird mit dem reallocAufruf initialisiert .
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);: Dieser Code hat (char *)eine Umwandlung, um den Rückgabewert von reallocin einen bestimmten Zeigertyp zu konvertieren . Dies wird in C nicht benötigt.
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));: Dieser Code dient char *als Operand sizeofzur Berechnung des benötigten Speicherplatzes. Dies ist nicht erforderlich, da die Größe übernommen werden kann sizeof *NewPointer, und dies ist im Allgemeinen vorzuziehen, da es sich automatisch an Änderungen in der Deklaration von anpasst NewPointer, wodurch die Möglichkeit verringert wird, dass ein Fehler durch Ändern des Typs in der Deklaration von, NewPointeraber mit Blick auf den sizeofAusdruck , auftritt .