Hinzufügen von Elementen in ein Array



  • Hallo,

    ich bin ziemlich neu in C und verstehe immer noch nicht wie das hinzufügen von Elementen in ein Array funktioniert. Ich muss ja den Wert des Elements in das Array >kopieren<, aber ich habe folgende 2 Fälle, in einem klappts, in anderem nicht:

    -hier lese ich eine Datei ein, und füge pro Zeile eine neue Struktur in das Array ein:

    typedef struct {
    int a;
    int b;
    } example;
    
    int main(int argc, char** argv) {
    
    int MAX = 100;
    example *my_array = malloc(sizeof(example)*1000);
    int index = 0; char *line = malloc(sizeof(char)*MAX); 
    FILE *file = fopen("link_zur_datei", "r");
    
    //..lasse nur das wichtigste drin
    
    while (fgets(line,MAX,file) != NULL) {
    
    example new_struct_in_line = {3,4};
    my_array[index] = new_struct_in_line;
    index++;
    }
    }
    

    Ist das so richtig? Also zumindest funktioniert das einwandfrei.

    Aber in der zweiten Anwendung funktioniert es nicht, da Speicher ich die Strukturen zwischen und füge sie nach der while loop,

    //alles so wie oben, hier bin ich jetzt nach der while loop:
    
    element *final_array = malloc(sizeof(element)*1000);
    int i;
    for (i=0; i < 1000; i++) {
    
    final_array[i] = my_array[i];
    }
    

    Sobald ich free(my_array) mache, ist auch final_array leer. Ich verstehe nicht, wieso hier der Inhalt nicht kopiert wird, und oben schon?!



  • tinchi schrieb:

    Sobald ich free(my_array) mache, ist auch final_array leer. Ich verstehe nicht, wieso hier der Inhalt nicht kopiert wird, und oben schon?!

    Da machst du etwas anderes falsch, denn durch das free werden keine Daten gelöscht.
    Sie sind nur ungültig und der Bereich kann wieder für etwas anderes verwendet werden.

    Wie stellst du fest, dass der Speicher (hinterher) leer ist?

    Für solche sachen gibt es auch memcpy



  • Im debugger ist dann my_array weg, aber das andere ist noch vorhanden, jedoch ohne die Elemente :S



  • Wie hängen denn example und element zusammen?

    Mach mal aus dem Beispiel ein minimales compilierbares Programm, was den Fehler reproduziert.
    (Am besten ohne fopen und fgets).



  • Kann es sein, dass es daran liegt, dass ich in Fall2. beide Arrays dynamisch Speicher zuordne, und dann der Compiler nicht weiss, was mit einem "=" anzufangen?

    Weil in Fall 1 wird zu meinem dynamischen array my_array immer nur lokal definierte Strukturen hinzugefügt werden?



  • Nein.

    In dem Beispiel oben hast du zwei unterschiedliche Typen: example und element.
    Aber das gibt einen Compilerfehler. Darum weiß ich nicht, was du sonst noch falsch gebostet hast.

    So habe ich das verstanden:

    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct {
    int a;
    int b;
    } example;
    
    void drucke(example *feld, int len, const char *text)
    {
        printf ("%15s %4d: %3d|%3d  %4d: %3d|%3d\n", text, 0, feld[0].a, feld[0].b, len-1, feld[len-1].a, feld[len-1].b);
    }
    
    int main(int argc, char** argv) {
    
      example *my_array = malloc(sizeof(example)*1000);
      int index = 0;
    
    //..lasse nur das wichtigste drin
    
      while (index < 1000) {
    
        example new_struct_in_line = {3,4};
        my_array[index] = new_struct_in_line;
        index++;
      }
      drucke(my_array,index, "my_array");
    //alles so wie oben, hier bin ich jetzt nach der while loop:
    
      example *final_array = malloc(sizeof(example)*1000);
      int i;
      for (i=0; i < 1000; i++) {
        final_array[i] = my_array[i];
      }
      drucke(final_array,i,  "final_array");
      drucke(my_array,index, "my_array");
    
      free(my_array);
      drucke(final_array,i,  "final_array");
      free(final_array);
    
      return(0);
    }
    

    Und das klappt.



  • DirkB schrieb:

    //[...]
    
      example *final_array = malloc(sizeof(example)*1000);
      int i;
      for (i=0; i < 1000; i++) {
        final_array[i] = my_array[i];
      }
      drucke(final_array,i,  "final_array");
      drucke(my_array,index, "my_array");
    
      free(my_array);
      drucke(final_array,i,  "final_array");
      free(final_array);
    
      return(0);
    }
    

    Und das klappt.

    Das funktioniert? Ok, dann bin ich verwirrt und muss nochmal nachgucken wo mein Fehler ist.

    Aber noch eine Verständnisfrage dazu, ich kann also einfach Elemente zu einem Array so wie in dem Beispiel hinzufügen. In welchen Fällen muss man dann die Methode memcpy dann benutzen ?? Und mir ist aufgefallen, dass man bei strings (wieder gleiches Beispiel, Datei eingelesen, u z.B. jede Zeile wird in array gespeichert) auch strcpy verwendet und nicht einfach wie oben "=" setzt. Wieso ist das so?



  • tinchi schrieb:

    Aber noch eine Verständnisfrage dazu, ich kann also einfach Elemente zu einem Array so wie in dem Beispiel hinzufügen.

    Nein, kannst du nicht. Du bist etwas schwerfällig beim Verstehen.
    Du kannst keine Arrays erweitern, keine Elemente hinzufügen.
    Du kannst nur bestehende einzelne Elemente (die im Array zusammengefasst sind) wertemäßig neu setzen.
    Wenn die Elemente struct sind, kannst du direkt zuweisen mit '=', wenn es Strings sind, nimmst du strcpy, in allen anderen Fällen memcpy.



  • Wutz schrieb:

    Nein, kannst du nicht. Du bist etwas schwerfällig beim Verstehen.
    Du kannst keine Arrays erweitern, keine Elemente hinzufügen.
    Du kannst nur bestehende einzelne Elemente (die im Array zusammengefasst sind) wertemäßig neu setzen.

    Das meinte ich damit, sorry dass dir meine Wortwahl nicht gefallen hat. Als einem Nichtmuttersprachler kann einem sowas schon mal passieren.
    Aber trotzdem danke für die Erklärung



  • Und ich glaube, dass es mit ints auch nur mit = Zeichen geht


Anmelden zum Antworten