2017-11-11 2 views
0

Ich habe Probleme, herauszufinden, wie Sie den Speicher für diese Strukturen zuweisen und freigeben.Wie können diese verschachtelten Strukturen richtig zugeordnet werden?

Ich muss dies verwenden, um FiniteTable's in Newton-Interpolation zu verwenden.

typedef struct{ 
    unsigned int empty; 
    float value; 
}FiniteTableValue; 

Die erste ist eine Art Knoten, der den wahren Wert hat.

typedef struct{ 
    FiniteTableValue *column; 
    unsigned int length; 
}FiniteTableRow; 

FiniteTableRow speichert ein Array von FiniteTableValues.

typedef struct{ 
    FiniteTableRow *row; 
    unsigned int length; 
}FiniteTable; 

FiniteTable speichert dann ein Array von FiniteTableRows.

typedef struct{ 
    FiniteTable *tables; 
    unsigned int length; 
}FiniteTableList; 

FiniteTableList ist die Liste der FiniteTable der

Ich versuchte es mit valgrind zu debugg und es scheint, dass ich immer eine Adresse zuzugreifen, die ich nicht zuordnen.

Ist dies auch der richtige Weg, um alle freizugeben?

FiniteTableList *ftl ... 
    ... 
    for(int i = 0; i < ftl->length; i++){ 
    FiniteTable table = ftl->tables[i]; 
    for(int j = 0; j < table.length; j++){ 
     FiniteTableRow row = table.row[j]; 
     free(row.column); 
    } 
    free(table.row); 
    } 
    free(ftl->tables); 
    free(ftl); 
+0

Was sind die Valgrind Fehler? Versuche mit '--track-origins = yes' zu laufen, wenn sie undefinierte Daten beinhalten. –

+0

Es für "Bedingter Sprung oder Bewegung hängt von nicht initialisierten Wert (en)" Ich weiß, wo sie sind, aber alles, was ich wissen muss, ist, wie einfach alle diese Strukturen mit malloc – Felipe

+0

initiieren In diesem Fall '--track-Herkunft = yes sollte Sie auf den Quellcode verweisen, den Sie reparieren müssen. Andernfalls müssen Sie die Valgrind-Fehler und den entsprechenden Quellcode posten. –

Antwort

1

In Ihrem Deallokation Beispiel des Ftl Objekt ist ein FiniteTableList eher als ein Zeiger (FiniteTableList *). Ich glaube, Sie zu schreiben bedeutete:

FiniteTableList ftl ... 

Um Speicher für eine FiniteTableList Struktur ordnen Sie so etwas tun würde:

/* Assuming every table in the list will have num_rows rows and num_columns columns. */ 
FiniteTableList * 
allocate_table_list (int num_rows, num_columns, int num_tables) 
{ 
    FiniteTableList * res = malloc (sizeof *res); 
    res->tables = malloc (num_tables * sizeof (*res->tables)); 
    res->length = num_tables; 
    for (int t = 0; t < num_tables; t++) 
    { 
     FiniteTable table = res->tables[t]; 
     table.row = malloc (num_rows * sizeof (*table.row)); 
     table.length = num_rows; 
     for (int r = 0; r < num_rows; r++) 
     { 
      FiniteTableRow row = table.row[r]; 
      row.column = malloc (num_columns * sizeof (*row.column)); 
      row.length = num_columns; 
     } 
    } 
    return res; 
} 

Wenn Sie den Speicher auf Null initialisieren wollen Sie Sie zuordnen können ersetzen die Aufrufe an malloc von calloc

+0

Was zugewiesen wird, wenn Sie FiniteTableList ausführen * res = malloc (sizeof * res); ? – Felipe

+0

Sie reservieren Speicher für das FiniteTableList-Objekt auf oberster Ebene. Der Ausdruck (sizeof * res) bedeutet "die Größe des Typs, auf den der Zeiger verweist". – Kyrill

Verwandte Themen