frage zu &operator
-
DocJunioR schrieb:
char *name;
Hier hast du einen Zeiger definiert.
Dadurch darfst du kein & beim scanf angeben.
(Allerdings wird das Programm dabei wahrscheinlich abschmieren, weil kein Speicher allokiert wurde)char name;
Dies ist ein einzelnes Zeichen.
Hier mußt du ein & angeben.Aha!Das heisst also ich belege einen Speicher der nicht fest ist und auch nicht reserviert wurde.Das heisst wenn ein anderes Programm die selbe Speicheradresse benutzt hab ich ein Problem....
-
newby20 schrieb:
DocJunioR schrieb:
char *name;
Hier hast du einen Zeiger definiert.
Dadurch darfst du kein & beim scanf angeben.
(Allerdings wird das Programm dabei wahrscheinlich abschmieren, weil kein Speicher allokiert wurde)char name;
Dies ist ein einzelnes Zeichen.
Hier mußt du ein & angeben.Aha!Das heisst also ich belege einen Speicher der nicht fest ist und auch nicht reserviert wurde.Das heisst wenn ein anderes Programm die selbe Speicheradresse benutzt hab ich ein Problem....
Ich meinte der Zeiger der auf die Adresse im Speicher zeigt wurde zufällig generiert.Und deshalb könnte es mit einem anderen Programm speichermäßig kollidieren.Ich hoffe das ist jetzt so richtig
-
C-Buch deiner Wahl: Kapitel Zeiger, dynamische Speicherverwaltung
Es kann nicht kollidieren es wird kollidieren. Du MUSST Speicher reservieren wenn du was reinschreiben willst. Wär ja noch schöner wenn jedes Programm hinschreibt wo er will.
-
newby20 schrieb:
Hallo
Kann mir jemand sagen warum das Einlesen der Daten ohne den & operator funktioniert?Ist das nur bei mir so?Ich dachte der wird für scanf benötigt...
Ist es falsch wenn man ihn wie in diesem Fall nicht einsetzt?char *name; printf("\nName: "); scanf("%s",name);//ohne & operator und es geht trotzdem... printf("\nName: %s",name);
Also, in C gibt & die Adresse, wo eine Variable sich befindet. scanf will eine Speicherstelle, wo sie die Daten schreiben kann. Deswegen ist scanf("%s",name); richtig, weil name bereits irgendwo zeigt. Benutzt du aber &name, dann gibt nicht die Adresse, auf die name zeigt sondern die Adresse, wo die Variable name selber gespeichert ist, und dass kann dazu führen, dass du den alten Pointer verliert.
Es gibt aber ein Problem mit diesem Code (wurde bereits von FireFlow erwähnt). Du hast nur char* name; aber name zeigt in den Himmel und dort kann der Computer nix schreiben, da wird dein Programm abstürzen, wenn nicht, dann ist der Compiler Schrott. Du musste nämlich den Speicher reservieren, d.h. du brauchst einen gültigen Speicher, wo du Schreibzugriff hast.
char name[20]; printf("\nName: "); scanf("%s",name); printf("\nName: %s",name);
Das Problem ist, in Name kannst du höchstens 19 Zeichen schreiben. Eine andere Möglichkeit wäre mit man: malloc(3) zu arbeiten, wobei du aber das selbe Problem hast, dass du davor nicht weißt, wie viele Zeichen gelesen werden müssen.
Aber eins ist sicher, du musst nämlich vor der Benutzung von scanf den Speicher reservieren.
edit: die Benutzung von einem char als Speicherung von Zeichenketten geht in die Hose, also mit einem char kann man nicht eine Zeichenkette speicher, dafür gibt es char* und char[]. Oder du musst ständig mit &-Operator arbeiten.
-
Die einfachste Lösung hier ist, scanf nicht zu benutzen.
Wie schon gesagt wurde, weißt du ja nicht, wie viele Zeichen eingegeben werden, und kannst dementsprechend den Buffer auch nicht groß genug machen.Dies kann zu Sicherheitslücken führen.
Am besten suchst du dir zum Parsen von Strings andere Funktionen.
Gruß
Rolf
-
Jo. Am Besten nie scanf() verwenden. fgets() und sscanf() wäre doch ne gute Sache
-
bei pointern wird automatisch waenn due nur den namen angibst die speicheradresse gemeint du kannst natuerlich bei einem pointer auch & mitangeben und es wird dennoch die speicheradresse gemeint.
-
--linuxuser-- schrieb:
bei pointern wird automatisch waenn due nur den namen angibst die speicheradresse gemeint du kannst natuerlich bei einem pointer auch & mitangeben und es wird dennoch die speicheradresse gemeint.
Erzähl nicht solchen Quatsch. Wenn p ein Pointer ist, dann ist p ohne & der Wert des Pointers (genauso wie bei allen anderen Datentypen), und dieser Wert ist eine Adresse. Die eines anderen Objekts zum Beispiel, oder ein Nullpointer. &p dagegen ist die Adresse des Pointers selbst.
-
Bashar schrieb:
--linuxuser-- schrieb:
bei pointern wird automatisch waenn due nur den namen angibst die speicheradresse gemeint du kannst natuerlich bei einem pointer auch & mitangeben und es wird dennoch die speicheradresse gemeint.
Erzähl nicht solchen Quatsch. Wenn p ein Pointer ist, dann ist p ohne & der Wert des Pointers (genauso wie bei allen anderen Datentypen), und dieser Wert ist eine Adresse. Die eines anderen Objekts zum Beispiel, oder ein Nullpointer. &p dagegen ist die Adresse des Pointers selbst.
das mein ich ja hab mich wohl etwas falsch ausgedrueckt tschuldigung...
-
Ein Pointer könnt ihr einfach so vorstellen, als hättet ihr eine int Variable, die eine Zahl speichert. Diese Zahl ist die Speicheradresse einer anderen Variable.
Wie ich schon sagte, &x gibt die Speicheradresse zurück, an der die Variable `x` gespeichert ist, unabhängig vom Datentyp von `x`. Also wenn p ein Pointer, dann ist immer &p != p (außer wenn p auf sich selbst zeigt).