www.mikrocontroller.net

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


Autor: PAT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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????

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auf was zeigt er denn, dein zeiger?

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: PAT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.