Ordnen Sie Speicher für eine Struktur mit einem Zeichenzeiger in C zu

7

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?

    
H_squared 15.08.2013, 07:24
quelle

6 Antworten

16

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.

%Vor%

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.

    
Devolus 15.08.2013, 07:27
quelle
4

wie Sie hier lesen können, müssen Sie die% zuweisen co_de% separat:

%Vor%     
No Idea For Name 15.08.2013 07:29
quelle
3

Fügen Sie eine zweite malloc für die Länge (N) hinzu, die Sie für word

benötigen %Vor%     
JackCColeman 15.08.2013 07:27
quelle
1

Wenn Sie Speicher für structptr zuweisen, hat der Zeiger word in struct keinen gültigen Speicher zum Zeigen. Also entweder malloc ein Stück Speicher für word , oder word zeigt auf ein anderes Zeichen.

    
Yu Hao 15.08.2013 07:28
quelle
0

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:

  1. Wie Sie sagten, deklarieren Sie es als char word[50] anstelle von 'char *'
  2. malloc / calloc (Ich persönlich bevorzuge calloc, erspare dir die Probleme von zeromemory, was sehr wichtig ist ..) die äußere Struktur, dann malloc / calloc auch die innere word . Denken Sie daran, auch in diesem Fall free doppelt aufzurufen.
Angela Yan 15.08.2013 07:33
quelle
-1

Verwenden Sie word=malloc(128);

Dies wird Ihrem variablen Wort 128 Bytes zuweisen,

    
Abhishek 15.08.2013 07:27
quelle

Tags und Links