1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

c pointer und printf

  • thisisme
  • 11. Oktober 2012 um 08:30
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • thisisme
    Punkte
    10
    Beiträge
    1
    • 11. Oktober 2012 um 08:30
    • #1

    moin,
    hab folgendes problem: wenn ich mir den pointer auf ein int in einer funktion erstell und retuniere und anschließend in der aufrufenden funktion auf den value vom pointer lesend zugreife scheint sich dieser zu ändern.

    Code
    #include <stdio.h>
    
    
    int *xyz() {
        int *valPtr = NULL;
        int value = 10;
        valPtr = &value;
        return valPtr;
    }
    
    
    
    
    int main() {
        int *valPtr = xyz();
    
    
        printf("val %d, %d, %d\n", *valPtr, *valPtr, *valPtr);
        printf("val %d\n", *valPtr);
        printf("val %d\n", *valPtr);
    
    
    
    
        return 0;
    }
    Alles anzeigen

    kompiliert mit "gcc -C90 -Wall -Wextra prog.c -o prog" gibt mir keine fehler oder warnings aus

    und tut folgendes wenn ich es anstarte:

    Code
    val 10, 10, 10
    val 48
    val 48

    warum auf einmal 48?! :(

  • Paulchen
    Gast
    • 11. Oktober 2012 um 11:39
    • #2

    "value" ist eine lokale Variable innerhalb der Funktion xyz(). Am Ende der Funktion wird der für diese Variable am Stack reservierte Speicherplatz freigegeben. Vor dem ersten Aufruf von printf() wurde dieser Speicherplatz allerdings noch nicht überschrieben. Sobald printf() aufgerufen wird, wird jedoch der Stack verwendet und somit der Wert der Variable value überschrieben.

    Um dieses Problem zu umgehen, musst du für value explizit Speicherplatz am Heap reservieren, der dann nicht automatisch freigegeben wird (das muss dann explizit durch Aufruf von malloc() passieren, um kein Memory Leak zu erzeugen). Das sieht dann etwa so aus:

    Code
    int *xyz() {
        int *valPtr = NULL;
        int *value = malloc(sizeof(int));
        *value = 10;
        valPtr = value;
        return valPtr;
    }

    Mein "gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" versteht -C90 übrigens nicht, nur -std=c90.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum