c pointer und printf

  • 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.

    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?! :(

  • "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.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!