Forum: Mikrocontroller und Digitale Elektronik Call-By-Reference Compiler Fehlermeldung!


von PAT (Gast)


Lesenswert?

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????

von gast (Gast)


Lesenswert?

auf was zeigt er denn, dein zeiger?

natürlich muss der zeiger erst auf eine adresse zeigen, bevor was geht!

von Matthias (Gast)


Lesenswert?

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.

von PAT (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.