2017-01-13 4 views
0

Ich versuche, ein Array von Strukturen dynamisch zu erstellen. Obwohl mit kleinen Größen scheint gut zu funktionieren, aber das Programm bricht später (Segmentierung Fehler). Wenn es eine große ipt_size hat, zerbricht es sehr schnell mit Nosense-Zahlen, also nehme ich an, dass das Problem in der Art ist, wie ich mein Array zuteile.Array von Strukturen dynamisch mit malloc zuweisen

int create_ipt(int ipt_size,frame **ipt){ 
    int i; 
    *ipt=malloc(ipt_size*sizeof(frame*)); 
for(i=0;i<ipt_size;i++){ 
    ipt[i]=malloc(sizeof(frame)); 
    if (ipt[i]==NULL) return 1; //error 
    ipt[i]->empty=1; 
    } 
return 0; //success 
}//create page table 

Ich rufe die Funktion mit

 frame *ipt; 
    create_ipt(ipt_size,&ipt); 

Wissen Sie, was geschieht? Rahmen 3 ints innen

+1

'* ipt = malloc (ipt_size * sizeof (Rahmen *));' -> '* ipt = mallo c (ipt_size * sizeof (frame)); '..' if (* ipt == NULL) gebe 1 zurück; für (i = 0; i BLUEPIXY

+0

Danke Mann. Das war der Weg. füge deinen Kommentar als Antwort hinzu, um es grün zu machen :) – panos

Antwort

2

Blick auf die Art von *ipt ist es frame *, das heißt, es ist ein Zeiger frame einzugeben, das heißt, weist auf einen Typ frame. Sie müssen also Speicher reservieren, der den Typ frame halten kann und die Adresse *ipt zuweisen.

Ändern Sie die Speicherzuweisung, um dieselbe anzuzeigen. Ändern

*ipt=malloc(ipt_size*sizeof(frame*)); 

zu

*ipt=malloc(ipt_size*sizeof(frame)); 

Dann werfen Sie einen Blick und revise (entfernen) die folgende Anweisung ipt[i]=malloc(sizeof(frame));, haben Sie bereits zugewiesenen Speicher zum Halten ipt_size Anzahl von Elementen.

Danach sehen Sie sich die Dereferenzierungsanweisung an. Statt

ipt[i]->empty=1; 

benötigen Sie

(*ipt)[i].empty = 1; 

und dass explizite Klammer ist es zu schreiben, weil die operator precedence (um den unerwünschten Effekt zu vermeiden).

0

In create_ipt, die Sie verwenden:

ipt den Zugriff ** ipt (Zeiger auf den Zeiger Sie im Haupt erstellt)

*ipt zuzugreifen * ipt (Zeiger auf die Struktur Rahmen)

**ipt zugreifen ipt (selbst struct Rahmen)

int create_ipt(int ipt_size, frame **ipt) 
{ 
     int i; 
     *ipt = malloc(ipt_size*sizeof(frame*)); // *ipt is the pointer to the struct frame you want to allocate memory) 
     for(i=0; i < ipt_size; i++) 
     { 
       // If you only have integers you don't need to allocate memory to the struct, it's already allocated, but if you have char* you should malloc that var 
       (*ipt)[i].text = malloc(text_size*sizeof(char)); 
       (*ipt)[i].empty = 1; 
     } 
     return 0; 
}