size_t is an unsigned integer data type that is used to represent the size of objects in bytes. It is commonly used to represent size of arrays, memory blocks, and strings in bytes. The size_t data type is defined in various header files such as <stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>.
The size_t is also used as the return type by the sizeof operator. It is big enough to contain the size of the biggest object that the system can handle.
Syntax
C
Characteristics of Size_t
- Unsigned Type: size_t is an unsigned data type therefore, it can only represent positive values or 0.
- Ability to represent size of all Objects: C Standard Library ensures that size_t is big enough to hold the size of the biggest object that the system can handle / maximum size of any object that can be allocated in memory
- Platform Dependency: Basically the maximum permissible size is dependent on the compiler; if the compiler is 32 bit then it is simply a typedef(i.e., alias) for unsigned int but if the compiler is 64 bit then it would be a typedef for unsigned long long.
Uses of Size_t in C
Many C library functions like malloc, memcpy and strlen declare their arguments and return type as size_t as it allows safe handling of large memory allocations without risking overflow.
Also, Size_t helps C standard library functions to maintain consistency and clarity in the code. As sizeof()
always returns a size_t. T
herefore, functions like malloc()
and memcpy()
that work with memory sizes to also use size_t
.
Example of C library functions Using size_t
C
// Here argument of 'n' refers to maximum
//blocks that can be allocated which
//is guaranteed to be non-negative.
void* malloc(size_t n);
// While copying 'n' bytes from 's2' to 's1'
// n must be non-negative integer.
void* memcpy(void* s1, void const* s2, size_t n);
// strlen() uses size_t because the length
//of any string will always be at least 0.
size_t strlen(char const* s);
where,
- size_t or any unsigned type might be seen used as loop variable as loop variables are typically greater than or equal to 0.
Note: When we use a size_t object, we have to make sure that in all the contexts it is used, including arithmetic, we want only non-negative values. For instance, the following program would definitely give the unexpected result:
Example 1: Using size_t as loop variable
C
// C program to demonstrate that size_t or
// any unsigned int type should be used
// carefully when used in a loop.
#include <stdio.h>
#define N 10
int main()
{
int a[N];
// This is fine.
for (size_t n = 0; n < N; ++n) {
a[n] = n;
}
// But reverse cycles are tricky for unsigned
// types as they can lead to infinite loops.
for (size_t n = N - 1; n >= 0; --n)
printf("%d ", a[n]);
}
Output:
Infinite loop and then segmentation fault
Explanation: The above program will result in a segmentation fault as the size_t is unsigned due to which the reverse cycle for the size_t will lead to an infinite loop.
Example 2: Using size_t to store size to array in bytes.
C
#include <stddef.h>
#include <stdio.h>
int main()
{
int array[5] = { 1, 2, 3, 4, 5 };
size_t size = sizeof(array);
printf("The size of the array is: %lu\n", size);
return 0;
}
OutputThe size of the array is: 20
Explanation : In this program, size_t is used to store the size of the array in bytes. The sizeof operator is used to determine the size of the array, which is then stored in the size variable of type size_t. The %lu format specifier is used to print the value of size_t, which is an unsigned long integer.
Advantages of using size_t in C programming:
- Portability: The size_t data type is defined in the stddef.h header, which is part of the C standard library. By using size_t, you can ensure that your code is portable across different platforms and compilers.
- Unsigned: size_t is an unsigned integer type, which means it can represent sizes up to the maximum size of unsigned integers. This is useful when dealing with arrays and memory blocks, as sizes can never be negative.
- Performance: size_t is usually implemented as a fast and efficient integer type, and using it can result in better performance than using other integer types.
- Clear intent: Using size_t makes it clear to the reader of your code that you are dealing with sizes and not other types of integers. This makes the code easier to understand and less prone to errors.
- Standardization: By using size_t, you are following a widely used and accepted standard, which makes your code more readable and maintainable for other programmers.
- Interoperability: size_t is widely used in many libraries and APIs, and using it in your code allows for easier integration with other code.
Similar Reads
What is the size_t data type in C?
size_t is an unsigned integer data type that is used to represent the size of objects in bytes. It is commonly used to represent size of arrays, memory blocks, and strings in bytes. The size_t data type is defined in various header files such as <stddef.h>, <stdio.h>, <stdlib.h>,
4 min read
Data Types in C
Each variable in C has an associated data type. It specifies the type of data that the variable can store like integer, character, floating, double, etc.Example:C++int number;The above statement declares a variable with name number that can store integer values.C is a statically type language where
5 min read
Data Type Modifiers in C
In C, data type modifiers are the keywords used to modify the original sign or length/range of values that various primitive data types hold such as int, char, and double.Let's take a look at an example:C#include <stdio.h> int main() { // Using unsigned int and trying // to store negative valu
4 min read
C++ Numeric Data Type
There are mainly 3 types of Numeric Data Types in C++ int unsigned intshort intunsigned short int long intunsigned long intlong long intunsigned long long intfloat double long double1. Integer (int) An integer is a type of datatype that can store integer values. Integer acquires 4 bytes in memory an
4 min read
char8_t Data Type in C++ 20
The most recent version of the C++ programming language, C++20, was introduced in the year 2020. The char8_t data type is one of the new features added to C++20. This data type was created especially to display UTF-8 encoded characters. Let's understand what char8_t is and how is it different from o
3 min read
Derived Data Types in C
Data types in the C language can be categorized into three types, namely primitive, user-defined, and derived data types. In this article, we shall learn about derived data types. In C, the data types derived from the primitive or built-in data types are called Derived Data Types. In other words, th
4 min read
C++ Data Types
Data types specify the type of data that a variable can store. Whenever a variable is defined in C++, the compiler allocates some memory for that variable based on the data type with which it is declared as every data type requires a different amount of memory.C++ supports a wide variety of data typ
7 min read
What is data type of FILE in C ?
Prerequisite : Basics of File Handling In C language, while file handling is done a word FILE is used. What is FILE? Example FILE *fp1, *fp2; While doing file handling we often use FILE for declaring the pointer in order to point to the file we want to read from or to write on. As we are declaring t
3 min read
User-Defined Data Types In C
Data Types are the types of data that can be stored in memory using a programming language. Basically, data types are used to indicate the type of data that a variable can store. These data types require different amounts of memory and there are particular operations that can be performed on them. T
4 min read
User Defined Data Types in C++
User defined data types are those data types that are defined by the user himself. In C++, these data types allow programmers to extend the basic data types provided and create new types that are more suited to their specific needs. C++ supports 5 user-defined data types:Table of ContentClassStructu
4 min read