Speicher in Funktion allokieren



  • Guten Tag,

    es ist doch möglich Speicher in einer Funktion zu allokieren, oder?

    void my_func(double* data)
    {
      data = new double[10];
      for (int c=0; c<10; ++c)
        data[c]   = 1;
    }
    
    // in main()
    double* my_data;
    my_frunc(my_data);
    cout << my_data[0] << endl;
    

    Dies führt bei mir zu einem Programm-Abbruch. Was ist da falsch?



  • void my_func(double*& data)
    {
      data = new double[10];
      for (int c=0; c<10; ++c)
        data[c]   = 1;
    }
    
    // in main()
    double* my_data;
    my_frunc(my_data);
    cout << my_data[0] << endl;
    

    du übergibst eine kopie des zeigers; nicht den zeiger selbst. habs korrigiert....



  • Hallo,
    dein Pointer wird "by value" übergeben, d.h. es wird eine Kopie des Pointers an die Funktion übergeben. An die Kopie hängst du dein neu alloziertes Array. Außerhalb der Funktion versuchst du dann aber über den Originalzeiger auf das Array zuzugreifen. Dieser wurde allerdings nie verändert -> ungültiger Zugriff.

    Du musst den Pointer also per Referenz übergeben: entweder im C-Style:

    void my_func(double** data)
    {
      *data = new double[10];
      for (int c=0; c<10; ++c)
        (*data)[c]   = 1;
    }
    double* my_data;
    my_frunc(&my_data);
    cout << my_data[0] << endl;
    

    Oder besser mehr C++-isch:

    void my_func(double*& data)
    {
      data = new double[10];
      for (int c=0; c<10; ++c)
        data[c]   = 1;
    }
    double* my_data;
    my_frunc(my_data);
    cout << my_data[0] << endl;
    

    Gute Praxis ist allerdings beides nicht, da der Aufrufer dazu gezwungen wird den Speicher wieder freizugeben. Besser wäre z.B. die Verwendung eines std::vector.



  • Perfekt. Vielen Dank für die Auskunft. Mal wieder was gelernt.

    Gruß, K.B.



  • warum machst du da & ?

    double* my_data;
    my_frunc(&my_data);
    


  • Damit holt er die Adresse von my_data und übergibt sie der Funktion my_func (Denn: void my_func(double data**))

    EDIT: Adressvariablen haben logischerweise auch eine Adresse im Speicher...sind also adressierbar 😉 .


Anmelden zum Antworten