Wie kann man erwartete Deklarationsspezifizierer oder '…' vor dem 'sizeof'-Fehler neu zuordnen?
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
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?
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 definiertNewPointer
. DannNewPointer
wird mit demrealloc
Aufruf initialisiert .NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);
: Dieser Code hat(char *)
eine Umwandlung, um den Rückgabewert vonrealloc
in einen bestimmten Zeigertyp zu konvertieren . Dies wird in C nicht benötigt.NewPointer = realloc(OldPointer, 100 * sizeof(char));
: Dieser Code dientchar *
als Operandsizeof
zur Berechnung des benötigten Speicherplatzes. Dies ist nicht erforderlich, da die Größe übernommen werden kannsizeof *NewPointer
, und dies ist im Allgemeinen vorzuziehen, da es sich automatisch an Änderungen in der Deklaration von anpasstNewPointer
, wodurch die Möglichkeit verringert wird, dass ein Fehler durch Ändern des Typs in der Deklaration von,NewPointer
aber mit Blick auf densizeof
Ausdruck , auftritt .