2017-01-16 1 views
-1

Das ist mein struct:Initialisierung der dynamischen Array von Strukturen

typedef struct ElementToInsert { 
    char *key; 
    char *value; 
} element; 

Diese meine Funktion ist:

void init_hash(int size, element**arr) { 
    *arr = malloc(size * sizeof(element*)); 
    if (arr == NULL) 
    { 
     printf("Out of memory\n"); 
     return 0; 
    } 
    for (int i = 0; i < size; i++) { 

     (*arr)[i].key = NULL; 
     (*arr)[i].value = NULL; 
    } 

} 

Und die main():

void main() { 
    element *hash_table = NULL; 
    int hash_table_size = 10; 
    init_hash(hash_table_size, &hash_table); 
} 

Das Problem ist, dass, wenn ich starte den Debugger (in Visual Studio 2015), es zeigt mir nicht alle Array-Werte. Ich erwarte, wie etwas zu sehen: hash_table[0] = {key = NULL, value = NULL}, hash_table[1] = {key = NULL, value = NULL} aber alles, was ich sehe, ist dies:

enter image description here

+1

Ihr Code macht keinen Sinn. '* arr' ist ein Zeiger auf' element', also sollten Sie 'size * sizeof (element)' dafür zuweisen (also * size * Elemente, nicht * size * Zeiger). – melpomene

+0

'* arr' ist dasselbe wie' arr [0] '. Ihre erste Schleifeniteration überschreibt den Zeiger, den Sie vom ersten Aufruf von malloc erhalten haben. – melpomene

+0

'main' sollte' int', nicht 'void' zurückgeben. – melpomene

Antwort

0

einen doppelten Zeiger auf init_hash Passing unnötig kompliziert. Obwohl es viele gültige Verwendungen für Doppelzeiger gibt, gehört dies nicht dazu. Normalerweise werden Doppelzeiger für mehrere Ausgabevariablen verwendet oder um vorhandenen Speicher auszutauschen, aber da Sie keinen Rückgabewert haben und Sie den Speicher trotzdem zuweisen, werden nur Fehler angezeigt. Halten Sie die Dinge einfach und geben Sie einen Zeiger auf Ihre Elementeliste zurück.

element *init_hash(size_t size) { 
    element *hash = calloc(size, sizeof(element)); 

    if (hash == NULL) { 
     fprintf(stderr, "Out of memory\n"); 
     exit(1); 
    } 

    return hash; 
} 

Ein paar Dinge von Bedeutung. Erstens: Um ein Array von Strukturen zuzuordnen, weisen Sie size * sizeof(element) zu. Das reserviert Speicher für size Strukturen. Wenn Sie size * sizeof(element*) verwenden, weist dieser Speicher für sizeZeiger auf die Struktur zu. Beide sind gültig, aber Sie müssen wählen, mit welchem ​​Sie arbeiten. Sie scheinen mit einer Liste von Strukturen zu arbeiten.

Im Gegensatz malloc wird calloc den Speicher für Sie auf Null setzen. Dies vermeidet die Notwendigkeit, jede Struktur manuell zu zerlegen, wodurch Code und Zeit gespart werden.

Wenn Sie nicht genügend Arbeitsspeicher haben und Sie nicht planen, sich damit zu beschäftigen, ist es wahrscheinlich am besten, nur eine ganze Reihe von nachfolgenden Fehlermeldungen zu speichern und exit. Die Größe wird am besten als size_t gespeichert. Es ist der Typ, den C für Array-Größen verwendet, und er kann einige Typprobleme auffangen.

+2

Hinweis: Null und NULL können unterschiedlich sein. – BLUEPIXY

+2

@BLUEPIXY Sie sind technisch korrekt, die beste Art von richtig! Da wir technisch sind, müssen '0' (die Konstante) und 'NULL' gleich sein (siehe 6.3.2.3.3). :) Aber ich weiß was du meinst. 7.20.3.1 stellt fest, dass das durch calloc "* vorgenommene Nullen nicht dasselbe sein muss wie die Darstellung des Gleitkommazolls oder einer Nullzeigerkonstante *", aber [das war jahrzehntelang kein Problem] (http: // c- faq.com/null/machexamp.html). Ich würde sagen, benutze die Technik und wenn du wirklich besorgt bist, füge ein 'char ** null_check = calloc (1, sizeof (char *)); assert (NULL == null_check [0]); 'zu Ihren Headern. – Schwern

Verwandte Themen