Hallo, ich habe folgende Code int TueEtwas(int *p1, int *p2) { return *p1+*p2; //die Routine gibt ein int Zahl zurück } int Rufe_ein_Pointer(int *p, int zahl) { int *zeiger; int temp; temp = TueEtwas(p,zeiger); } beim ausführen bekomme ich eine Fehlermeldung :--> *zeiger muss initialisiert werden!!! Frage: WARUM????
auf was zeigt er denn, dein zeiger? natürlich muss der zeiger erst auf eine adresse zeigen, bevor was geht!
weil in der variable zeiger (und damit auch in p2) sonst einfach nur irgendwas (z.B. 0) steht, und *irgendwas bzw. *0 einfach nur unsinnig ist. Bzw bei nem anständigen Betriebssystem gibts ne Speicherzugriffsverletztung.
hallo, aber *zeiger wird doch in TueEtwas() aufgerufen! und TueEtwas() erwartet 2 Pointer als argumente. und diese Pointer IN TUEETWAR() zeigen auf 2 Adressen (die gultigen Werte haben) und geben DOCH die summe zurück. so gesehen *zeiger weiß erst in TueEtwas() auf was sie zeigt! --> warum dann die Fehlermeldung??? MfG
1/ Auf p2 wird in TueEtwas() zugegriffen; der Inhalt wird für die Addition abgefragt, d.h. irgendwo muss es auch einen existierenden Inhalt geben. 2/ In Rufe_ein_Pointer() wird TueEtwas() aufgerufen, wobei an Stelle von p2 zeiger gesetzt wird. Kombiniert mit 1/ heisst das, zeiger muss auf einen existierenden Inhalt zeigen. 3/ In Rufe_ein_Pointer() wird zeiger definiert als int *zeiger und es wird keine Zuweisung an zeiger gemacht. Der Compiler initialisiert zeiger mit dem Wert NULL. Kombiniert mit 2/ heisst das, dass die Bedingung "zeiger muss auf einen existierenden Inhalt zeigen", nicht erfüllt ist. Ändere int *zeiger; in int *zeiger = &zahl; // initialisiere mit der Adresse der Variablen zahl dann läuft es formal. Ob das allerdings der Sinn des Programmfragments ist, kann ich nicht entscheiden (letztlich würde so temp = *p+zahl ausgeführt). ADD: Sei froh, dass dein Compiler (oder Debugger/Runtime-Library) diesen Fehler findet. Nullpointer-Zugriffe liegen mit an der Spitze der Programmierfehler.
> Der Compiler initialisiert zeiger mit dem Wert NULL.
Das tut er nicht.
int *zeiger;
ist eine Stackvariable und die werden von C nicht automatisch
initialisiert. Ihr Inhalt vor der ersten Zuweisung ist undefiniert.
Stimmt. Gut, dass jemand aufpasst! http://www.dclc-faq.de/kap1.htm#1.1 http://www.dclc-faq.de/kap3.htm#3.1 "Variablen der Speicherklasse automatic (lokale Variable ohne statische Speicherklasse) werden beim Programmstart nicht initialisiert, es sei denn, der Programmierer tut dies explizit. Über den Inhalt dieser Variablen darf ansonsten keine Annahme gemacht werden." http://www.dclc-faq.de/kap17.htm#17.1
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.