C Sizeof

The concept of 'sizeof' in C.

Sizeof Operator

The 'sizeof' operator is used to determine the size in bytes of a data type, a variable, or an expression. The result of the 'sizeof' operator is a constant of type 'size_t', which represents the size of the specified object in bytes.

Here's the basic syntax of the 'sizeof' operator:

sizeof(object)

Note: The size returned by 'sizeof' can vary depending on the system and compiler. It's not necessarily in bytes; it's in units that the system uses for memory allocation.

The object can be a data type, a variable, or an expression. For example:

Size of a data type:

size_t intSize = sizeof(int);

* 'intSize' will contain the size of an int in bytes.

Size of a variable:

int x;
size_t xSize = sizeof(x);

* 'xSize' will contain the size of the variable x in bytes.

Size of an array:

int arr[10];
size_t arrSize = sizeof(arr);

* 'arrSize' will contain the size of the whole array in bytes.

Size of an expression:

size_t exprSize = sizeof(5 + 3.14);

* 'exprSize' will contain the size of the result of the expression in bytes.

Structure with Sizeof

The 'sizeof' operator in C is important when working with structs for several reasons:

  1. Memory Allocation: The 'sizeof' operator helps you determine the memory size required to store a 'struct' in memory. This information is essential when allocating memory dynamically using functions like 'malloc' or when dealing with memory layout in embedded systems.
  2. Memory Alignment: Structs are often aligned in memory to improve access speed. The 'sizeof' operator helps you understand the alignment requirements, which can vary depending on the data types in the struct. You can use this information to optimize memory usage and access times.
  3. Array Sizing: When working with arrays of structs, you can use 'sizeof' to calculate the size needed for the array. This ensures that you allocate enough memory to hold all the struct instances.
  4. Pointer Arithmetic: The 'sizeof' operator also helps you calculate the offset between elements in an array of structs. This is especially important when traversing or manipulating data structures.

Here's an example illustrating some of these points:

c Copy Code
#include <stdio.h>

struct Student
{
    int r;
    char n[50];
    float g;
};
int main()
{
    printf("Size of struct Student: %lu bytes\n", sizeof(struct Student));
    struct Student s[5];
    printf("Size of students array: %lu bytes\n", sizeof(s));
    size_t sz = sizeof(struct Student);
    struct Student *p = s;
    for (int i = 0; i < 5; i++)
    {
        printf("Student %d is at address %p\n", i, p);
        p += 1;
    }
    return 0;
}

In this example, 'sizeof' is used to determine the size of the 'struct Student' and the array of students. It also helps calculate the offset when moving through the array using a pointer.

Output:
Size of struct Student: 60 bytes        
Size of students array: 300 bytes       
Student 0 is at address 00000013b43ffbf0
Student 1 is at address 00000013b43ffc2c
Student 2 is at address 00000013b43ffc68
Student 3 is at address 00000013b43ffca4
Student 4 is at address 00000013b43ffce0

Note: The actual memory addresses (0x...) will depend on your system, so they will not be the same as shown here. The sizes may vary depending on the system's architecture and the compiler.

What's Next?

We actively create content for our YouTube channel and consistently upload or share knowledge on the web platform.