Frage zu scanf mit char und Adresse
-
SeppJ schrieb:
Der Formatspezifizierer für Pointer ist %p. Ein guter Compiler sollte dich davor warnen können. Vermutlich hast du auch einen guten Compiler, aber nutzt dessen Warnoptionen nicht (oder ignorierst die Warnungen).
oder doch ein schlechter Compiler?
-
Nein, die igrnoriere ich nicht. Er gibt keine aus, Compiler ist der GCC für Code::Blocks. Wieso soll ich den Pointerspezifizierer verwenden, wenn ich keinen Pointer verwende?
Es funktioniert zwar, aber so ganz logisch ist mir das nicht.
Dabei ist mir aufgefallen, wenn ich %d für zahl1 verwende, bekomme ich ein DEZ - Adresse, wenn ich das %d durch %p ersetze, bekomme ich eine HEX - Adresse. Wieso ist das so?
-
Was ist denn deiner Meinung nach &zahl1 bzw. &eingabe für ein Typ, wenn nicht int* bzw. char*? Du bekommst bei %d eine Zahl, weil %d Integers ausgibt und printf sich nach besten Kräften bemüht deine int* Eingabe irgendwie als Integer aufzufassen und das Standardformat für Integer ist eben erst einmal die Dezimalschreibweise. Ebenso beim zweiten printf, wo versucht wird, den Zeiger irgendwie als ein Zeichen zu interpretieren. Das Verhalten ist aber undefiniert und das Ergebnis wird in der Regel auch nicht den Wert des Zeigers wiederspiegeln.
Der Pointer wird standardmäßig als Hex-Zahl ausgegeben, weil das für Leute die sich für die Absolutwerte von Pointern interessieren in der Regel besser lesbar ist.
Benutz beim gcc die Optionen -Wall und -Wextra
-
Weil %d die Formatangabe für einen
int
als Dezimalzahl ist.
Und Adressen lassen sich leichter als Hexzahlen vergleichen.Du kannst nicht davon ausgehen, dass der Wertebereich von einer Adresse (Zeiger) der Gleiche ist wie bei einem
int
. (Geht schon gar nicht wegen des Vorzeichens).Bei
printf()
müssen die Argumente zu den Formatangaben passen, sonst kommt Müll raus. Und ein Pointer ist keinint
. Der Compiler erkennt das auch und gibt normalerweise Warnungen aus.Warnungen
solltemuss man beachten.
-
O.k. Super. Vielen Dank für die schnelle und kompetente Hilfe, auch wenn ich noch nicht bei den Pointern bin
. Auch danke für die Tipps mit dem Compiler, hab ich so eben aktiviert
-
Mit & bist du bei Pointern.
Mit scanf bist du auch bei Pointern.
-
In meinem Buch noch nicht. Vielleicht wird später nochmal drauf eingegangen, aber bewußt steht da nichts von geschrieben (C - Programmieren von Anfang an).
-
Tja, mit dem Buch bist du wohl reingefallen.
Scheint noch mehr Fehler zu enthalten.
-
77 Leute sagen was anderes:
http://www.amazon.de/product-reviews/3499600749/ref=cm_cr_pr_hist_5?ie=UTF8&showViewpoints=0&filterBy=addFiveStar
-
Das sind dann aber die Anfänger, die nicht beurteilen können, ob es gut war oder nicht. Siehe auch:
http://xkcd.com/937/
-
Der Autor der Kritik hat ja größtenteils recht, aber zwei Dinge interessieren mich:
'array' und '&array' sind eben nicht das Gleiche
Nein? Könnte mir das jemand erklären? (Gerne gleich mit Verweiß auf den Standard.)
feof wird direkt nach fopen verwendet ( ohne Hinweis auf Besonderheiten )
Besonderheiten?
-
lopfl schrieb:
'array' und '&array' sind eben nicht das Gleiche
Nein? Könnte mir das jemand erklären? (Gerne gleich mit Verweiß auf den Standard.)
Das eine ist ein Array, das andere ist ein Zeiger auf ein Array. Das kann in vielen Kontexten die gleiche Wirkung haben, da einerseits ein Array beim kleinsten Zeichen von Gefahr in einen Zeiger auf sein erstes Element zerfällt und andererseits ein Zeiger auf ein Array sich ohne Murren in einen Zeiger auf das erste Element konvertieren lässt, aber es ist nicht das gleiche
feof wird direkt nach fopen verwendet ( ohne Hinweis auf Besonderheiten )
Besonderheiten?
Manche Leute haben da den Tick, dass da ein Sonderfall vorliegt, aber ich habe nie verstanden, wieso sie das so sehen. Irgendwas vonwegen, dass feof bei leerer Datei nach dem Öffnen nicht gesetzt ist. Was ich aber genau so auch erwarten würde.
-
SeppJ schrieb:
Wutz hat da den Tick, dass da ein Sonderfall vorliegt, aber niemand hier hat je verstanden, wieso er das so sieht.
Wutz hat auch bereits zwei Links auf Rezensionen von "Max" gepostet, glaubt hier einer an Zufall :xmas2: ?
Äquivalent zu
array
wäre doch&array[0]
, mit dem Zeiger wäre call by reference möglich:void f1(const char* array) { array = "Word"; } void f2(const char** array) { *array = "World"; } int main() { const char* src = "Hello"; const char* c = src; puts(c); f1(c); puts(c); f2(&c); puts(c); return 0; }
Ausgabe wie erwartet
Hello Hello World
-
Thorgrim schrieb:
Äquivalent zu
array
wäre doch&array[0]
, mit dem Zeiger wäre call by reference möglich:Nein, das ist ein anderes Problem. Denke mal an sizeof.
Edit: Abgesehen davon gibt es in deinem Code nicht mal ein Array? oO
Edit2: @SeppJ: Die erste Version trifft es aber auf den Punkt.
-
cooky451 schrieb:
Denke mal an sizeof.
Edit: Abgesehen davon gibt es in deinem Code nicht mal ein Array? oOIch geh ins Bett
-
SeppJ schrieb:
lopfl schrieb:
'array' und '&array' sind eben nicht das Gleiche
Nein? Könnte mir das jemand erklären? (Gerne gleich mit Verweiß auf den Standard.)
Das eine ist ein Array, das andere ist ein Zeiger auf ein Array. Das kann in vielen Kontexten die gleiche Wirkung haben, da einerseits ein Array beim kleinsten Zeichen von Gefahr in einen Zeiger auf sein erstes Element zerfällt und andererseits ein Zeiger auf ein Array sich ohne Murren in einen Zeiger auf das erste Element konvertieren lässt, aber es ist nicht das gleiche
Ein Arrayname zerfällt außer bei 4 hier nicht relevanten Ausnahmen in einen Zeiger auf das erste Element/Elementtyp, &Arrayname zerfällt in einen Zeiger auf das ganze Array. Nirgendwo im Standard steht, dass Array und Einzelelement das gleiche Alignment haben müssen, und deshalb
`A pointer to an object or incomplete type may be converted to a pointerto a different object type or a different incomplete type. The
resulting pointer might not be valid if it is improperly aligned for
the type pointed to.`
Kapitel 3.3.4 ANSI C
-
Nett: http://ideone.com/DbfDt
-
Wutz schrieb:
Nirgendwo im Standard steht, dass Array und Einzelelement das gleiche Alignment haben müssen,
Sicher? Mindestens bei C++ ist dies garantiert, daher nahm ich immer an, dass das bei C auch so ist. Aber ich werde jetzt nicht den ganzen C-Standard durchwühlen, um das genau heraus zu finden, wenn du mir sagst, dass du da wirklich sicher bist.