Dynamischen Vektor in einer Struktur



  • Hallo, ich habe mal eine Frage zu dynamischen Vektoren innerhalb von Strukturen.

    Das ganze sieht etwa so aus:

    struct Zahlen {
    
         int *ptr;
         int anzahl;
    }
    

    Wenn ich die Struktur erzeuge mache ich folgendes:

    zahlen erzeuge() {
    
    Zahlen z = malloc(sizeof(zahlen));
    z->ptr = NULL;
    z->anzahl = 0;
     return z;
    
    }
    

    Soweit passt das auch , jetzt die frage wenn ich den dynamischen Vector beschreiben möchte muss ich doch erstmal für die einzelnen Elemente Speicher innerhalb des Vectors definieren, als beispiel hier 10 Int-Werte richtig?

    int index = 10;
    
    while ( index > 0 ) {
    
    z->ptr[index] = malloc(sizeof(int));
    index--;
    
    }
    


  • Nein. Du musst dem Pointer Speicher für die gewünschte Menge an ints zuweisen:

    z->ptr = malloc(10 * sizeof(int));

    für 10 ints mit den Indizes 0 - 9.



  • Tarsuinn schrieb:

    Soweit passt das auch

    Nö, das geht auch nicht durch den Compiler. Guck dir Zeile 3 mal an. Wofür ist da das malloc? Und in den Zeilen 4 und 5 nutzt du "->" statt ".".

    Tarsuinn schrieb:

    jetzt die frage wenn ich den dynamischen Vector beschreiben möchte muss ich doch erstmal für die einzelnen Elemente Speicher innerhalb des Vectors definieren, als beispiel hier 10 Int-Werte richtig?

    Der Code den du gepostet hast macht überhaupt keinen Sinn. z.ptr ist NULL, und das dereferenzierst du dann. Das kann nur schief gehen.

    #include <stdlib.h>
    
    typedef struct int_vector
    {
      int *ptr;
      size_t size;
    } int_vector;
    
    int resize_int_vector(int_vector *v, size_t new_size)
    {
      int *p = realloc(v->ptr, new_size);
      if (p != NULL)
      {
        v->ptr = p;
        v->size = new_size;
        return 1;
      }
      return 0;
    }
    
    void reset_int_vector(int_vector *v)
    {
      free(v->ptr);
      v->ptr = NULL;
      v->size = 0;
    }
    
    int main(void)
    {
      int_vector v = {};
      if (resize_int_vector(&v, 500))
      {
        v.ptr[499] = 45632; // Letzter gültiger Index.
        reset_int_vector(&v);
      }
      return 0;
    }
    

Anmelden zum Antworten