2016-04-15 4 views
0

Ich habe eine Funktion, die Werte auf eine Struktur setzt:Wie ordne ich Speicher korrekt einem dynamischen Array von Ganzzahlen zu, die in einer Struktur gespeichert sind?

Meine Struktur:

struct entry { 
    char key[MAX_KEY]; 
    int* values; 
    size_t length; 
    entry* next; 
    entry* prev; 
}; 

Meine Funktion:

// Sets entry values 
void command_set(char **commands, int arg_num) { 
    struct entry e; 
    e.length++; 
    strcpy(e.key, commands[1]); 
    for (int i = 2; i < arg_num; i++) { 
     e.values[i - 2] = atoi(commands[i]); 
    } 
} 

wo:

  • ** Befehle: ist ein Array von Strings
  • arg_num: ist wie viele Strings sind in dem Array
  • Schlüssel: ist der Name des Eintrags
  • Werte: ganzzahlige Werte speichern in dem Eintrag

ich den Code ausführen und ich erhalte einen Segmentation Fault 11. Ich verengt es bis auf die Linie:

e.values[i -2] = atoi(commands[i]); 

ich gehe davon aus, dass ich malloc verwenden müssen Speicher zuzuweisen, da ich nicht erscheinen mit meiner Schleife außerhalb der Grenzen gegangen zu sein. Ich habe versucht, den richtigen Weg zu verstehen, um Speicher zuzuordnen, aber ich kann nicht scheinen, die Syntax korrekt zu bekommen, um sizeof (int) einem dynamischen Array von ganzen Zahlen zuzuordnen.

Ich habe versucht:

e.values[i - 2] = malloc(sizeof(int)); 

und

e.values[i - 2] = (int) malloc(sizeof(int)); 

und

e.values[i - 2] = malloc(sizeof(int *)); 

Allerdings erhalte ich die Fehlermeldung:

incompatible pointer to integer conversion assigning 
    to 'int' from 'void *' [-Werror,-Wint-conversion] 
+0

Es gibt ziemlich viel falsch mit diesem, und auch einige verwirrende Sachen wie, was Sie mit 'struct entry e' nachher tun wollen. Was willst du erreichen? Die Unterstützung bei der Korrektur von Zuweisungen und nicht definiertem Verhalten ist möglicherweise irrelevant, da Ihre aktuelle Vorgehensweise möglicherweise ungeeignet ist. Versuchen Sie, ein vollständiges Beispiel dieses Codes in Ihrem Programm zu zeigen. – paddy

Antwort

4

Sie müssen das gesamte Array zuweisen:

e.values = malloc(sizeof(int) * (arg_num - 2)) 

Wichtig: Denken Sie daran, free zu rufen, wenn Sie mit dem Speicher fertig sind oder Sie einen Speicherverlust haben.


Sie haben ein anderes Problem, unabhängig von dem, nach dem Sie fragen.

Sie tun

struct entry e; 
e.length++; 

Wenn die Strukturobjekt e definiert ist, ist es uninitialized, alle ihre Mitglieder einen unbestimmten Wert haben wird. Die Verwendung solcher nicht initialisierter Daten in irgendeiner Weise außer der Initialisierung führt zu undefiniertem Verhalten. Und Sie tun verwenden Sie solche nicht initialisierten Werte, wenn Sie e.length++ tun.

Diese Erhöhung macht im Code keinen Sinn, wie Sie es zeigen. Auf der anderen Seite ist diese Funktion sowieso wenig sinnvoll, da die Variable e und alle ihre Daten einfach "verschwinden", wenn die Funktion zurückkehrt. Ich kann also nur annehmen, dass es nicht die komplette Funktion ist, die Sie uns zeigen.

Um die Struktur zu allen Nullen zu initialisieren, einfach

struct entry e = { 0 }; 
+0

Dies funktioniert aber kann ich fragen, ob Sie dann den Speicher für das gesamte Array von ganzen Zahlen basierend darauf, wie viele ganze Zahlen Sie eingeben müssen? – joshuatvernon

+1

@joshuatvernon Dafür ist die Multiplikation gedacht. Sie scheinen 'arg_num - 2' Werte im Array zu verwenden, also multipliziere ich die Größe eines' int' mit dieser Zahl. –

1

tun ändern, wie unten die Funktion.

void command_set(char **commands, int arg_num) { 
    struct entry e; 
    e.length++; 
    strcpy(e.key, commands[1]); 
    //here is the memory allocation 
    e.values = malloc(arg_num-1 * sizeof(int)); 
    for (int i = 0; i < arg_num-1; i++) { 
     e.values[i] = atoi(commands[i+1]); 
    } 
} 
2

als Ihre Struktur ist wie folgt

struct entry { 
    char key[MAX_KEY]; 
    int* values; 
    size_t length; 
    entry* next; 
    entry* prev; 
}; 

dann sollten Sie Speicher, um es als

e.values =(int *)malloc(arg_num*sizeof(int)); 

zuweisen wie wenn Sie 10 Werte haben, dann sind Sie 10 * 4 Werte Zuweisung zu es. kostenlos auf sie

free(e.values) 

und rufen, wenn die e oder e.values ​​nicht mehr nützlich ist. Für weitere Informationen können Sie see here

Verwandte Themen