Ich habe heute Schwierigkeiten, einen Code zu reparieren, dann stoße ich auf etwas Ähnliches wie:
%Vor% Der Code verursachte viele Speicherfehler aufgrund der Tatsache, dass char* word
eine Zeichenfolge variabler Länge ist und malloc ihm nicht genügend Speicher zugewiesen hat. In der Tat wurde nur 20 Bytes
für die gesamte struct
zugewiesen. Gibt es eine Möglichkeit, dieses Problem zu umgehen, ohne char*
in " char word[50]
" zu verwandeln?
Sie reservieren nur Speicher für die Struktur selbst. Dies schließt den Zeiger auf char ein, der bei 32bit-Systemen nur 4 Byte beträgt, da er Teil der Struktur ist. Es enthält KEINE Speicher für eine unbekannte Länge der Zeichenfolge, also wenn Sie eine Zeichenfolge haben möchten, müssen Sie auch Speicher für diese Zeichenfolge manuell reservieren. Wenn Sie nur eine Zeichenfolge kopieren, können Sie strdup()
verwenden, die die Zeichenfolge zuweist und kopiert. Sie müssen den Speicher jedoch trotzdem selbst freigeben.
Wenn Sie keinen Speicher für die Zeichenfolge selbst reservieren möchten, besteht die einzige Möglichkeit darin, ein Array fester Länge in Ihrer Struktur zu deklarieren. Dann wird es Teil der Struktur und sizeof(mystruct)
wird es enthalten. Ob dies zutrifft oder nicht, hängt jedoch von Ihrem Design ab.
wie Sie hier lesen können, müssen Sie die% zuweisen co_de% separat:
%Vor% Fügen Sie eine zweite malloc
für die Länge (N) hinzu, die Sie für word
malloc Die äußere Struktur wird nur 1 Byte Speicher zuweisen, auf den *word
zeigt, da es sich um einen 'char *' Typ handelt. Wenn Sie mehr als 1 Byte Speicher zuweisen möchten, auf den word
zeigt, gibt es 2 Optionen:
char word[50]
anstelle von 'char *' word
. Denken Sie daran, auch in diesem Fall free
doppelt aufzurufen.