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.