2017-10-27 4 views
0

Ich versuche, ein Array einer Struktur zu erstellen, aber ich weiß es nicht Größe am Anfang.Verwenden Sie malloc für Doppelzeiger in C90

struct MyStruct** thing; 
size_t thing_len = 0; 
thing = (struct MyStruct**) malloc(thing_len * sizeof(struct MyStruct*)); 
//... 
thing_len += 1 
thing = (struct MyStruct**) realloc(thing_len * sizeof(struct MyStruct*)); 

Wenn ich das tun thing den Typ 0x0MyStruct* statt MyStruct** und enthält bekommt. Aber wenn ich mache

struct MyStruct* thing; 
size_t thing_len = 0; 
thing = malloc(thing_len * sizeof(struct MyStruct)); 
//... 
thing_len += 1 
thing = realloc(thing_len * sizeof(struct MyStruct)); 

Es funktioniert !!

Ich weiß nicht, ob es etwas ändert, aber ich verwende -ansi und -pedantic Optionen.

+0

Bitte geben Sie eine [MCVE]. – Mat

+3

[Bitte lesen Sie in dieser Diskussion, warum nicht den Rückgabewert von malloc() und Familie in C ..] werfen (https://stackoverflow.com/q/605845/2173917) –

+0

Es ist immer eine gute Idee, die zu lesen Dokumentation zu den verwendeten Funktionen. – alk

Antwort

4

In Ihrem Code

realloc(thing_len * sizeof(struct MyStruct*)); 

ist ein falscher Aufruf der Funktion. Sie müssen das Format [Überprüfen Sie die man page.]

realloc(<old pointer>, new size); 

Das heißt, ein Format wie

oldPointer = realloc (oldPointer, newSize); 

ein sehr gefährlich Stück Code ist. Falls realloc() fehlschlägt, wirst du auch den ursprünglichen Zeiger verlieren !!

Die vorgeschriebene Art und Weise realloc() zu verwenden ist

tempPointer = realloc (oldPointer, newSize); //store the return 
if (tempPointer)        // is it success? 
{ 
     oldPointer = tempPointer;    // cool, put it back to the variable you want 
} 
      //--> here, whether or not realloc is success, you still got a _valid_ pointer. 
+0

In vielen Fällen wird ein Programm dazu verdammt sein, einen miserablen Tod in jedem Fall zu sterben, wo 'realloc()' scheitern würde. Ein explizites 'if (! OldPointer) out_of_memory_error()' könnte besser sein als das Absterben von einem SIGSEGV, aber es ist nicht unbedingt hilfreich, eine Kopie des alten Zeigers in Fällen zu behalten, in denen Code sowieso sterben wird. Es ist schade, dass es keine Standardfunktionen für "malloc_or_die", "realloc_or_die" usw. gibt, da sie die Notwendigkeit für viel redundanten Fehlerbehandlungscode beseitigen könnten. – supercat