Anzeige:
Ergebnis 1 bis 4 von 4

Thema: malloc() mit lokaler Variable geht nicht?

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.07.2007
    Beiträge
    38

    malloc() mit lokaler Variable geht nicht?

    Hallo,

    ich habe das Problem, dass ich wahrscheinlich Irgendetwas wichtiges bei der Verwendung von malloc vergesse oder nicht berücksichtige und komme einfach nicht drauf, warum folgendes funktioniert

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int *arr;
    
    void allocate_memory(int arraysize) {
      int i;
    
      arr = (int *) malloc(sizeof(int)*arraysize);
    
      arr[0]=arraysize;
    
      for (i=1; i<arraysize; i++) arr[i]=i;
    }
    
    void read_memory() {
      int i;
    
      for (i=0; i<arr[0]; i++) printf("arr[%i]=%i\n",i,arr[i]);
    }
    
    int main()
    {
    
      allocate_memory(4);
      read_memory();
    
      return 0;
    }
    und folgendes NICHT funktioniert (führt zu Segfault)

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    void allocate_memory(int *arr, int arraysize) {
      int i;
    
      arr = (int *) malloc(sizeof(int)*arraysize);
    
      arr[0]=arraysize;
    
      for (i=1; i<arraysize; i++) arr[i]=i;
    }
    
    void read_memory(int *arr) {
      int i;
    
      for (i=0; i<arr[0]; i++) printf("arr[%i]=%i\n",i,arr[i]);
    }
    
    int main()
    {
      int *arr;
    
      allocate_memory(arr,4);
      read_memory(arr);
    
      return 0;
    }
    Der einzige Unterschied ist, dass der Pointer arr einmal global und einmal lokal definiert ist - da er aber lokal in main() definiert ist, sollte ich doch keine Probleme haben, da die lokalen Variablen in main() solange gültig sind wie das Programm läuft.
    Was mache ich da falsch? Ich bräuchte hier mal einen kleinen Denkanstoss oder bin mittlerweile einfach zu vernagelt um es zu sehen...

    Edit: Der Segfault-Fehler tritt übrigens erst in read_memory() auf.

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Das Problem ist, dass allocate_memory den Parameter arr selbst ändert. Das funktioniert nicht, denn der Pointer an sich wird auch nur by-Value übergeben, also kopiert. Du musst hier also mit einem int** arbeiten:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    void allocate_memory(int **arr, int arraysize) {
      int i;
    
      *arr = (int *) malloc(sizeof(int)*arraysize);
    
      (*arr)[0]=arraysize;
    
      for (i=1; i<arraysize; i++) (*arr)[i]=i;
    }
    
    void read_memory(int *arr) {
      int i;
    
      for (i=0; i<arr[0]; i++) printf("arr[%i]=%i\n",i,arr[i]);
    }
    
    int main()
    {
      int *arr;
    
      allocate_memory(&arr,4);
      read_memory(arr);
    
      return 0;
    }

  3. #3
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von Yonibear Beitrag anzeigen
    Du musst hier also mit einem int** arbeiten:
    Oder alternativ den Wert zurückgeben:
    Code:
    int *allocate_memory(int arraysize) {
      int *arr;
      int i;
    
      arr = (int *) malloc(sizeof(int)*arraysize);
      arr[0]=arraysize;
      for (i=1; i<arraysize; i++) arr[i]=i;
    
      return arr;
    }
    Liebe Grüße,
    Axel

  4. #4
    Registrierter Benutzer
    Registriert seit
    17.07.2007
    Beiträge
    38
    Jetzt wo ich es vor mir sehe ists mir auch glasklar...

    void function(int x) {
    ...
    }

    kann x zwar verändern, aber da x ja eine neue lokale Variable ist und in der main() der Wert der übergebenen Variable rauskopiert wird, bleibt die Variable in der main-Funktion halt einfach dieselbe.
    Für solche Fälle hat man Zeiger, und wenn ich einen Zeiger ändern will brauche ich dann halt einen Zeiger auf einen Zeiger. Eigentlich logisch und mir auch soweit bekannt...
    Hätte ich dem Kind einen neuen Namen gegeben wärs mir bestimmt sofort aufgefallen, aber so hab ich einfach nicht begreifen können warum das nicht geht

    Danke an euch beide!
    Geändert von shutdown (21-09-2009 um 21:03 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •