1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

c pointer und printf

  • thisisme
  • 11. Oktober 2012 um 08:30
  • Unerledigt
  • thisisme
    1
    thisisme
    Mitglied
    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?! :frowning_face:

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

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern