Mailinglist Archive: opensuse-programming-de (174 mails)
| < Previous | Next > |
Re: scanf()
- From: "Alexander Veit" <list@xxxxxxxxxx>
- Date: Sat, 17 Jan 2004 13:11:48 +0100
- Message-id: <200401171210.i0HCAiCk027630@xxxxxxxxxxxxxxxxx>
Bernhard Walle schrieb:
> * Bernhard Walle <Bernhard.Walle@xxxxxx> [2004-01-16 17:07]:
> > * Bodo Kaelberer <BodoKaelberer@xxxxxxxxxx> [2004-01-16 16:33]:
> > > P.S: Woher weisst printf eigentlich, ob ich ein char, int
> > > oder sonstwas uebergebe? Also woher weiss es, dass es fuer
> > > die Darstellung nur auf ein Byte zugreifen muss, wo doch
> > > %d auch fuer ints verwendbar ist?
printf weiß es nicht. printf nimmt int an, da %d im Formatstring übergeben
wurde.
> > Gar nicht. printf() bekommt keinen Zeiger sondern einen Wert.
> > char wird einfach vor der Übergabe auf int erweitert.
Ja, s.u.
> ich glaube ganz so einfach ist es doch nicht. Richtig sollte man %hd
> (short) oder %hhd (char) angeben.
>
> Was sagen die Experten?
Bin zwar kein Experte, werde mich aber trotzdem mal dran versuchen...
Falls die Adressgröße des Stack-Segmentes 32Bit ist, landen die Parameter,
die an printf übergeben werden immer an 32Bit-Grenzen.
Falls der Datentyp kleiner 32Bit ist, macht dies nichts aus, da die
höherwertigen Bytes beim pushen auf den Stack auf Null gesetzt werden. Dies
gilt auch für char.
Auf dem Stack liegt damit sozusagen (int)buf[i], das %d funktioniert.
--
Gruß,
Alex
> * Bernhard Walle <Bernhard.Walle@xxxxxx> [2004-01-16 17:07]:
> > * Bodo Kaelberer <BodoKaelberer@xxxxxxxxxx> [2004-01-16 16:33]:
> > > P.S: Woher weisst printf eigentlich, ob ich ein char, int
> > > oder sonstwas uebergebe? Also woher weiss es, dass es fuer
> > > die Darstellung nur auf ein Byte zugreifen muss, wo doch
> > > %d auch fuer ints verwendbar ist?
printf weiß es nicht. printf nimmt int an, da %d im Formatstring übergeben
wurde.
> > Gar nicht. printf() bekommt keinen Zeiger sondern einen Wert.
> > char wird einfach vor der Übergabe auf int erweitert.
Ja, s.u.
> ich glaube ganz so einfach ist es doch nicht. Richtig sollte man %hd
> (short) oder %hhd (char) angeben.
>
> Was sagen die Experten?
Bin zwar kein Experte, werde mich aber trotzdem mal dran versuchen...
Falls die Adressgröße des Stack-Segmentes 32Bit ist, landen die Parameter,
die an printf übergeben werden immer an 32Bit-Grenzen.
Falls der Datentyp kleiner 32Bit ist, macht dies nichts aus, da die
höherwertigen Bytes beim pushen auf den Stack auf Null gesetzt werden. Dies
gilt auch für char.
Auf dem Stack liegt damit sozusagen (int)buf[i], das %d funktioniert.
--
Gruß,
Alex
| < Previous | Next > |