Open In App

size_t data type in C

Last Updated : 21 May, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

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
size_t variable_name;

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. Therefore, 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;
}

Output
The 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.

Next Article
Practice Tags :

Similar Reads