Speicherreservierung



  • Hallo

    ich habe letztens ein Program über Speicherverwaltung erstellt wo aber Fehler drinne waren

    #include <stdio.h>
    #include <malloc.h>
    #include <process.h>
    #include <conio.h>
    
    int main(void)
    {
        long *Zeiger;
    
        Zeiger = (long *) malloc(4);
    
        printf("Bitte Zahl eingeben: ");
        [b]scanf("%d",&Zeiger);[/b]
        printf("Speicherplatz: %d\n\n",sizeof(Zeiger));
        [b]printf("DIe Ganzzahl ist %d\n\n",Zeiger);[/b]
    
        getch();
    
        free(Zeiger);
    
        printf("speicher freigegeben...");
    
        getch();
    
        return EXIT_SUCCESS;
    }
    

    so nachdem mir die Fehler mitgeteilt wurden hab ich das Program noch einmal überarbeitet

    #include <stdio.h>
    #include <malloc.h>
    #include <process.h>
    #include <conio.h>
    
    int main(void)
    {
        long *Zeiger = NULL;
    
        Zeiger = (long *) malloc(sizeof(Zeiger));
    
        printf("Bitte Zahl eingeben: ");
        scanf("%d",Zeiger);
        printf("Speicherplatz: %d\n\n",sizeof(Zeiger));
        printf("DIe Ganzzahl ist %d\n\n",*Zeiger);
    
        getch();
    
        free(Zeiger);
    
        printf("speicher freigegeben...");
    
        getch();
    
        return EXIT_SUCCESS;
    }
    

    So nun die Frage ist es so richtig??
    und könnt ihr mir noch ein paar Fragen beantworten??

    Zeiger = (long *) malloc(sizeof(Zeiger));
    

    was genau geht hier von statten?? wiesoe(long 😉 und wieso zeiger = ..
    müsste es nicht andersrum sein??

    scanf("%d",Zeiger);
    

    wie kann ich einem Zeiger der auf noch nichts zeigt einen Wert zuweisen oder muss da noch ein * davor??

    Der Rest ist soweit klar. ganz nach dem Motto: es gibt keine dummen Fragen nur dumme Antworten hoffe ich, dass ihr mir ein wenig weiterhelft

    mfg



  • HoPPeL schrieb:

    Zeiger = (long *) malloc(sizeof(Zeiger));
    

    was genau geht hier von statten?? wiesoe(long 😉 und wieso zeiger = ..
    müsste es nicht andersrum sein??

    Da die Funktion "malloc" einen Zeiger von Typ void liefert, muss es, in deinem Fall nach Typ "long" umgewandelt werden. Also casten heisst das.
    Zeiger = (Umgewandelte Ruckgabewert) von Funktion malloc()

    HoPPeL schrieb:

    wie kann ich einem Zeiger der auf noch nichts zeigt einen Wert zuweisen oder muss da noch ein * davor??

    Das kannst, und darfst du nicht machen, einem Zeiger muss immer erst eine Adresse zugewiesen werden, und erst dann kanst du auf das Inhalt mittels "*" zugreigen.

    Hoffe hab mich verständlich ausgedrückt, sonst siehe meine Name 😃



  • Zeiger = (long 😉 malloc(sizeof(Zeiger));

    solltest du in

    Zeiger = malloc(sizeof(long));

    ändern.

    "die Funktion "malloc" einen Zeiger von Typ void liefert, muss es, in deinem Fall nach Typ "long" umgewandelt werden. Also casten heisst das."

    Falsch. In C muss man nicht casten. Man kann, wenn man Spass dran hat aber casten tut er auch alleine.



  • feigling schrieb:

    Falsch. In C muss man nicht casten. Man kann, wenn man Spass dran hat aber casten tut er auch alleine.

    Ja richtig, aber nur wenn man Source als C-Code compilliert.
    Aber es gibt viele die VC++ benutzen, den Code als cpp compilieren (z.B. main.cpp und nicht main.c) und dann wundern sich warum Compiller Fehler ausspukt.
    Na ganz einfach, in C++ muss man casten.
    Und da das casten im C nicht schadet, warum auch nicht? 👍
    Später kann man sich dadurch aber ne Menge Ärger sparen!



  • hmmm okay

    also müsste ich noch eine extra variable festlegen

    int eingabe = 0;
    

    dann auf diese den Zeiger zeigen lassen

    Zeiger = &eingabe;
    

    und dann eingabe einlesen?

    scanf("&d",&eingabe);
    

    ------------------------------------

    jo das mit dem casten dachte ich mir auch schon irgendwie so aber wiedo ist in der klammer noch ein *??

    mfg



  • Du benötigst keinen extra-Zeiger, wenn du direkt auf die Variable zugreifen willst. (und für dein Beispiel dürfte die Speicherverwaltung mit malloc/free sowieso Overkill sein). Es reicht völlig aus, scanf die Adresse deiner Variablen zu sagen:

    long i;
    scanf("%ld",&i);
    

    (btw, wenn du "scanf("%d",&i);" verwendest, erwartet die Funktion einen Pointer auf int als Parameter - für long benötigst du die Kennung "%ld")



  • Ausländer schrieb:

    Ja richtig, aber nur wenn man Source als C-Code compilliert.
    Aber es gibt viele die VC++ benutzen, den Code als cpp compilieren (z.B. main.cpp und nicht main.c) und dann wundern sich warum Compiller Fehler ausspukt.
    Na ganz einfach, in C++ muss man casten.
    Und da das casten im C nicht schadet, warum auch nicht? 👍
    Später kann man sich dadurch aber ne Menge Ärger sparen!

    Gleich 3 Denkfehler:
    1. Wir sind im C Forum, dh wir gehen erstmal davon aus, dass wir eine C Quellcodedatei und einen C Compiler haben.
    2. In C++ verwendet man kein gecastetes malloc, sondern new.
    3. Wir schreiben unsere Dateien entweder in C oder C++, nicht beides gleichzeitig. Entscheide dich für eine Sprache. Da sie sowieso nicht 100%ig kompatibel sind, macht es auch keinen Sinn, seine Quellcodedateien kompatibel zu halten.


Anmelden zum Antworten