2017-01-02 1 views
1

Ich habe diese Struktur:Gibt es eine Möglichkeit, ein Array von Strings in einer Struktur zu initialisieren, wenn Sie nicht wissen, wie viele Elemente Sie in die Zeichenfolge einfügen werden?

typedef struct SomeStruct { 
    char someString[]; 
} SomeStruct; 

Dies erzeugt einen Fehler, da someString ‚s Größe ist nicht definiert, wenn initialisiert.

Ich möchte someString ein Array von Strings machen, aber ich werde die Größe des Arrays zum Zeitpunkt der Initialisierung nicht wissen. (Die Elemente, die in dem Array enthalten sind, hängen von Benutzereingaben später im Programm ab).

Ist es möglich, dies als ein Array von Strings zu initialisieren, ohne die Größe des Arrays zu kennen?

+1

Verwenden Sie stattdessen einen Zeiger. –

+2

Ihr Code-Snippet zeigt ein Array von Zeichen, kein Array von Strings. – derek

+0

Für ein Array von Strings muss der Typ innerhalb der 'struct'' char ** 'sein. – jackarms

Antwort

2

Ja, die C-Standard spricht über diese in 7.2.18-26. Was Sie beschreiben, ist als flexibles Array-Mitglied einer Struktur bekannt. Vom Standard:

Als Sonderfall kann das letzte Element einer Struktur mit mehr als einem benannten Element einen unvollständigen Array-Typ aufweisen. Dies wird als flexibles Array-Element bezeichnet.

Wesentlichen, was es sagt, ist, wenn das letzte Mitglied der Struktur ein Array von nicht definierten Größe ist (wie es der Fall für die Laufzeitgrößen sein), dann, wenn die Struktur verwenden, können Sie die entsprechende Größe zuteilen würde Ihre Struktur einschließlich, wie groß Sie die Zeichenfolge sein möchten. Zum Beispiel:

typedef struct SomeStruct { 
    char someString[]; 
} SomeStruct; 

hat das flexible Array-Mitglied someString. Ein üblicher Weg, dies zu nutzen ist:

SomeStruct *p = malloc(sizeof (SomeStruct) + str_size); 

Unter der Annahme, dass der Aufruf von malloc erfolgreich ist, zeigte das Objekt von p verhält, für die meisten Zwecke, als ob p wie erklärt worden war:

struct {char someString[str_size]; } *p; 

Lesen Sie den Standard für weitere Details. Das Schlagwort flexible array member wird auch viele Informationen zeigen. Die wikipedia ist ein guter Anfang.

1

Sie können eine Struktur mit flexiblem Array verwenden. Zum Beispiel

typedef struct SomeStruct 
{ 
    size_t n; 
    char someString[]; 
} SomeStruct; 

wo n wird verwendet, um die Anzahl der Elemente in dem Array zu speichern.

Dann können Sie Objekte der Struktur erstellen die folgende Art und Weise

SomeStruct *s = malloc(sizeof(SomeStruct) + 10 * sizeof(char[100])); 
s->n = 10; 
1

Wenn Sie ein dynamisches Array nicht verwenden können (es klingt so, wenn Sie einen Kompilierfehler dafür bekommen), können Sie das Array tatsächlich überlaufen, solange es sich am Ende der Struktur befindet, und so lange wie Sie tatsächlich auf diesen Speicher zugreifen können. Beispiel:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct SomeStruct { 
    char someString[10]; 
} SomeStruct; 

int main (void) 
{ 
    // Allocate 4x space, so we have room to overrun 
    SomeStruct *p = malloc(sizeof(SomeStruct) * 4); 

    p->someString[38] = 'a'; 
    printf("%c\n", p->someString[38]); 
} 

Natürlich haben Sie immer noch, um tatsächlich den Raum zuweisen, so kann es nicht so nützlich für Sie sein, je nach Fall.

Verwandte Themen