[so] SIZE_MAX vs SSIZE_MAX

Razvan Crainea razvan.crainea at gmail.com
Wed Mar 12 08:57:21 EET 2014


2014-03-12 0:47 GMT+02:00 Pascu Corneliu Florin <
pascucorneliuflorin at gmail.com>:

> Salut,
>
> Din ce vad read are urmatoarea declaratie  *ssize_t* read(int fd , void *
> buff, *size_t* len);
> Totul este ok , dar ce se intampla cand fac ceva de genul: *read(fd,
> buff, SIZE_MAX)*;
> SIZE_MAX vad ca este 0xffffffff , iar SSIZE_MAX este 0x7fffffff.  Orice
> read cu len>SSIZE_MAX
> este undefined , right? Atunci de ce este len size_t definit in POSIX si
> nu ssize_t ?
>

Salut, Florin!

* size_t este un tip întreg fără semn
* ssize_t vine de la signed size_t, adică un întreg cu semn

Conceptual, nu poți citi un număr negativ de octeți. Prin urmare al treilea
parametru trebuie să fie un tip întreg, fără semn (size_t). Altfel, dacă
s-ar folosi ssize_t, atunci ai putea specifica un număr negativ.
read() întoarce numărul de octeți citiți (un număr întreg pozitiv), 0 în
caz că nu a citit nimic și -1 în cazul în care a fost o eroare. Deci pentru
valoarea de return, avem nevoie de un tip întreg, cu semn (ssize_t).

Sper că acum e clar de ce antetul read() a fost proiectat așa.

Baftă!
-- 
Răzvan Crainea
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20140312/552873de/attachment-0001.html>


More information about the so mailing list