2016-06-06 21 views
-1

Ich habe eine Funktion erstellt, die ich verwenden möchte, um dynamisch Speicher für meine Struktur wie so zu reservieren. scheint es einfach nichtWie kann ich in C Speicherplatz für meine Struktur zuweisen?

typedef struct My_Struct 
{ 
    char **array 
}MyStruct 

MyStruct * createMyStruct(int length) 
{ 
    MyStruct->array = malloc(sizeof(char *) * (length + 1)); 
} 

int main(void) 
{ 
    MyStruct *new1 = createMyStruct(10); 
    return 0; 
} 
+3

Sie können 'nicht verwenden MyStruct-> array'. 'MyStruct' ist ein Typname, kein Variablenname. – Barmar

+0

Sie "Ihre Struktur nicht zuweisen", aber Sie können Instanzen Ihrer Struktur zuweisen. – immibis

Antwort

0

Sie nicht MyStruct Art zur Arbeit zu kommen benutzen könnte seine Felder zu initialisieren, da sie nicht statisch sind. Sie müssen zunächst eine Instanz erstellen, initialisieren und dann - von Ihrer Methode zurückkehren.

MyStruct * createMyStruct(int length) 
{ 
    MyStruct* pResult = malloc(sizeof(MyStruct)); 
    pResult->array = malloc(sizeof(char *) * (length + 1)); 
    return(pResult); 
} 

Vergessen Sie nicht, Speicher freizugeben, nachdem Sie fertig sind, es zu verwenden.

PS: Dieser Code ist auch seltsam:

pResult->array = malloc(sizeof(char *) * (length + 1)); 

Wenn Sie versuchen, Array von Strings mit der gleichen Länge zu initialisieren, es ist falsch. Sie erhalten ein Array von length+1 mit nicht initialisierten Zeigern. Wenn Sie einfach ein Array zuweisen, um es später zu verwenden - dann ist die Erhöhung length möglicherweise falsch.

+0

Dies sollte wahrscheinlich ein spärliches Array von "Strings" werden, wobei das Pointer-Array 'NULL' terminiert (wie' argv' in 'main()'), also würde das +1 für den Sentinel sein. – alk

+0

Kann sein, aber das ist unklar von der Frage. Also dachte ich, dass es besser ist, darauf hinzuweisen) – Ari0nhh

+0

Es wäre auch wichtig, eine Fehlerüberprüfung bei den Aufrufen von 'malloc()' durchzuführen. – alk

1

Es ist einfach, wie die Zuteilung sizeof(MyStruct) und ptr MyStruct Gießen:

MyStruct * createMyStruct(int length) 
{ 
    MyStruct* s = malloc(sizeof(MyStruct)); 
    s->array = malloc(sizeof(char*) * (length + 1)); 
    return s; 
} 

By the way, in der Regel eine Struktur hat keine Zeiger drin, aber nur Arrays mit festen Größen oder zumindest ein char*[] statt von einem char* seit Strukturen haben in der Regel eine feste Größe, leichter zuzuordnen. Wenn Sie meine obigen Code verwenden, vergessen Sie nicht, die char* s die char** bezieht sich auch zuzuteilen, da die malloc in meinem Code nur die Zeiger zuweist und nicht die Saiten itselfes

+2

'(MyStruct *)' und '(char **)' sind nicht notwendig. – immibis