dynamisch angeforderten Speicher außerhalb einer Funktion verwenden



  • Hi,
    ich bins mal wieder und habe ein kleines Problem mit dem angeforderten Speicher.

    Der Code sieht in etwas so aus:

    int setze(int *feld)
    {
      int i=10; //wird im Programm dynamisch festgelegt
      feld=new int[i];
      for(int j=0; j<i; j++)
      {
        feld[j]=j;  //das Feld wird mit Werten belegt
      }
      return i;
    }
    int main(int argc, char* argv[])
    {
      int *data=NULL, anz=0, i=0;
      anz=setze(data);
      //data ist "NULL"  :( 
      for(i=0; i<anz; i++)
      {
        cout<<data[i]<<endl; //führt zu einer Speicherverletzung, da data==NULL
      }
      return 0;
    }
    

    Meine Frage ist nun, wie kann ich mir einen Pointer auf den reservierten Speicher halten, um später darauf zuzugreifen?
    Wenn es möglich ist, will ich es ohne eine Globale Variable umsetzen und auch ohne return.

    Danke



  • naja, du musst feld natürlich aus der Funktion zurückgeben.
    Allerdings ist in dem Fall das aufrufende PRogramm für die spätere Speicherfrage verantwortlich.
    Alternativ lässt du deshalb den Speicher vom aufrufenden Programm reservieren und übergibst der Funktion einen Zeiger auf bereits reservierten Speicher, sowie dessen Grösse.
    Eine andere, leichter zu handhabende Alternative ist die Verwendung von std::vector



  • Hallo,
    du übergibst deinen Zeiger data per Wert an die Funktion. D.h. in der Funktion wird eine Kopie dieses Zeigers verwendet. Lässt du in der Funktion den Zeiger auf ein anderes Objekt zeigen (new ...), so hat dies keine Auswirkung auf deinen Zeiger data. Du musst also den Zeiger per Referenz übergeben. D.h. entweder als Zeiger auf Zeiger (der C-Weg) oder als Referenz auf einen Zeiger.

    Schön ist beides nicht, wie scrontch ja bereits schrieb.



  • @HumeSikkins
    könntest Du mir mal bitte ein Beispiel für ne Referenz auf einen Zeiger geben. Bin da heute etwas langsam. 🙄



  • Sicher:

    // Referenz
    int setze(int*& feld) 
    { 
      feld=new int[i]; 
      ...
    } 
    
    int main(int argc, char* argv[]) 
    { 
      int *data...
      anz=setze(data); 
    }
    
    // Zeiger auf Zeiger
    int setze(int** feld) 
    { 
      *feld=new int[i]; 
      ...
    } 
    
    int main(int argc, char* argv[]) 
    { 
      int *data...
      anz=setze(&data); 
    }
    


  • Danke, jetzt gehts.


Anmelden zum Antworten