I am so confused about size_t
. I have searched on the internet and everywhere mentioned that size_t
is an unsigned type so, it can represent only non-negative values.
My first question is: if it is used to represent only non-negative values, why don't we use unsigned int
instead of size_t
?
My second question is: are size_t
and unsigned int
interchangeable or not? If not, then why?
And can anyone give me a good example of size_t
and briefly its workings?
typedef /*This part is implementation dependent */ size_t;
if it is use to represent non negative value so why we not using unsigned int instead of size_t
Because unsigned int
is not the only unsigned integer type. size_t
could be any of unsigned char
, unsigned short
, unsigned int
, unsigned long
or unsigned long long
, depending on the implementation.
Second question is that size_t and unsigned int are interchangeable or not and if not then why?
They aren't interchangeable, for the reason explained above ^^
.
And can anyone give me a good example of size_t and its brief working ?
I don't quite get what you mean by "its brief working". It works like any other unsigned type (in particular, like the type it's typedeffed to). You are encouraged to use size_t
when you are describing the size of an object. In particular, the sizeof
operator and various standard library functions, such as strlen()
, return size_t
.
Bonus: here's a good article about size_t
(and the closely related ptrdiff_t
type). It reasons very well why you should use it.
There are 5 standard unsigned integer types in C:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
with various requirements for their sizes and ranges (briefly, each type's range is a subset of the next type's range, but some of them may have the same range).
size_t
is a typedef
(i.e., an alias) for some unsigned type, (probably one of the above but possibly an extended unsigned integer type, though that's unlikely). It's the type yielded by the sizeof
operator.
On one system, it might make sense to use unsigned int
to represent sizes; on another, it might make more sense to use unsigned long
or unsigned long long
. (size_t
is unlikely to be either unsigned char
or unsigned short
, but that's permitted).
The purpose of size_t
is to relieve the programmer from having to worry about which of the predefined types is used to represent sizes.
Code that assumes sizeof
yields an unsigned int
would not be portable. Code that assumes it yields a size_t
is more likely to be portable.
unsigned int
, unsigned long
, etc.) that size_t
corresponds to depends on the machine on which the code is run? i.e. on one machine architecture, it corresponds to unsigned int
but on another architecture it will correspond to unsigned long
, etc?
size_t
, especially if, for example, unsigned long
and unsigned long long
are the same size.
long
, long long
etc. do depend on the system: If you take a look at limits.h
you will at least under Unices see that the max value for ints depends on the word size of the system.
size_t
has a specific restriction.
Quoting from http://www.cplusplus.com/reference/cstring/size_t/ :
Alias of one of the fundamental unsigned integer types. It is a type able to represent the size of any object in bytes: size_t is the type returned by the sizeof operator and is widely used in the standard library to represent sizes and counts.
It is not interchangeable with unsigned int
because the size of int
is specified by the data model. For example LLP64 uses a 32-bit int
and ILP64 uses a 64-bit int
.
Apart from the other answers it also documents the code and tells people that you are talking about size of objects in memory
apple
is an apple, a size_t
is a size...
size_t is used to store sizes of data objects, and is guaranteed to be able to hold the size of any data object that the particular C implementation can create. This data type may be smaller (in number of bits), bigger or exactly the same as unsigned int.
size_t type is a base unsigned integer type of C/C++ language. It is the type of the result returned by sizeof operator. The type's size is chosen so that it could store the maximum size of a theoretically possible array of any type. On a 32-bit system size_t will take 32 bits, on a 64- bit one 64 bits. In other words, a variable of size_t type can safely store a pointer. The exception is pointers to class functions but this is a special case. Although size_t can store a pointer, it is better to use another unsigned integer type uintptr_t for that purpose (its name reflects its capability). The types size_t and uintptr_t are synonyms. size_t type is usually used for loop counters, array indexing and address arithmetic. The maximum possible value of size_t type is constant SIZE_MAX .
size_t
can store the size of any single object. A pointer can point to any byte of any object. You can have a system with, for example, a 64-bit address space that limits the size of any one object to 2**32-1 bytes. There is no guarantee that size_t
and uintptr_t
are the same type.
In simple words size_t is platform and as well as implementation dependent whereas unsigned int is only platform dependent.
Success story sharing
size_t
be aunsigned char
? Is this in the standard that it's allowed? I mean with that idea how could anyone be expected to usecalloc()
(and family),strlen()
etc.? That seems to me absurd.size_t
is defined in the standard to be an "unsigned integer type", but doesn't require it to be the same as any ofunsigned {char, short, int, long, long long}
.unsigned char
assize_t
. You don't need to worry about whatsize_t
will be, compilers takes care of it depending on the target architecture.