MARTIN hat geschrieben:scanf erwartet schließlich einen zeiger,
Das ist falsch. scanf erwartet keinen Zeiger sondern beliebige
Argumente - egal welchen Typs:
Die Deklaration von scanf sagt nichts von Zeigern.
Letztendlich braucht scanf intern nur eine Adresse in Form
einer Zahl.
Folgender Code ist bei dieser Deklaration also völlig legal:
Hier übergebe ich eine Speicheradresse in Form einer Zahl,
und an dieser Adresse soll scanf den eingelesenen Floatwert
ablegen.
Auf Systemen mit ungeschützten und festen Speicherbereichen
ist das sogar ein muß.
Denke nur mal an den C64, dort hat man dauernd mit festen
Adressen gearbeitet. Auf embedded Systemen wird das teilweise
bestimmt noch genauso sein.
Da C platformunabhängig ist, muß das ja auch möglich sein -
auf Windows crasht der obige Code natürlich, solange man auf
die Adresse "12345" keinen Zugriff hat.
MARTIN hat geschrieben:egal in welcher Form und die Variable "wert" wurde nirgendwo
als Zeiger initialisiert.
Genau das hätte eine Warnung verursachen können.
Ja, **können**.
Das ist aber kein Teil der Spezifikation und wird somit nicht
gefordert.
In dem einen Beispiel vorhin siehst Du das ich ein 'unsigned long'
an scanf übergebe, und das ist durch '...' völlig legal.
Ein 'unsigned long' ist auch kein Zeiger, genauso wie ein 'float'.
Das u-long enthält in meinem Beispiel nur zufällig die Speicheradresse
des floats, weshalb es auch korrekt funktioniert.
Laut der Deklaration von scanf mit '...' ist es also egal ob man
ein long, float, &long, &float, long* oder float* übergibt.
Der Compiler kann, *wenn er möchte*, die Formatcodes und
die übergebenen Argumente überprüfen und dann eine Warnung
ausgeben.
Einen Fehler darf er aber nicht werfen, da laut Deklaration
alle Argumenttypen erlaubt sind.
Das ursprüngliche Problem (vergessen des Adressoperators '&')
ist ein reiner Programmierfehler, da es eben auch erlaubt ist
float und long etc. direkt zu übergeben. Die Deklaration von
scanf erwartet eben nicht explizit einen Zeiger.