How to implement your own sizeof operator in C?

How does sizeof Work?

C provides a compile-time unary operator called sizeof that can be used to compute the size of any object. The sizeof operator can be used in two forms. First, to get size of an object that can be a variable or array or structure. Second, to get size of a type name that can be the name of a basic type like int or double, or a derived type like a structure or a pointer. The following expressions shows the syntax of sizeof

sizeof (object);
and
sizeof (type name);

The sizeof operator yields an integer equal to the size of the specified object or type in bytes. (Strictly, sizeof produces an unsigned integer value whose type, size_t, is defined in the header <stddef.h>.)

A sizeof cannot be used in a #if directive, because the preprocessor does not parse type names. But sizeof in the #define is not evaluated by the preprocessor, so the code here is legal.

Implement Your Own sizeof

Now come to implementation of the sizeof operator. The sizeof in C is an operator, and all operators have been implemented at compiler level; therefore, you cannot implement sizeof operator in standard C as a macro or function. You can do a trick to get the size of a variable by pointer arithmetic. However, pointer arithmetic underneath uses the sizeof operator to figure out the size of the type in order to increment or decrement the pointer to point either next or previous object location.

The following C program develops a small macro SIZEOF() that replicates the functioning of sizeof when used to get size of variables.

#include <stdio.h>
#define SIZEOF(object) (char *)(&object+1) - (char *)(&object)
int main()
{
    double x;
    int arr[10];
    printf("double var size: %d\n", SIZEOF(x));
    printf("double type size: %d\n", sizeof(double));
    printf("int arr[10] size : %d\n", SIZEOF(arr));
    return 0;
}
 
OUTPUT
======
double var size: 8
double type size: 8
int arr[10] size : 40

The above macro implementation of SIZEOF won't work for SIZEOF(double) because the argument passed to SIZEOF must be a variable, not a type. Following is a silly trick which first creates a variable of given type then calls SIZEOF with that variable, but this is not a feasible and fool proof solution. You cannot call DECLARE_TYPE two times, second time it will through error saying "redeclaration of newvar".

#include <stdio.h>
#define SIZEOF(object) (char *)(&object+1) - (char *)(&object)
#define DECLARE_TYPE(type) __typeof__(type) newvar
int main()
{
    double x;
    int arr[10];
    printf("double var size: %d\n", SIZEOF(x));
    printf("double type size: %d\n", sizeof(double));
    printf("int arr[10] size : %d\n", SIZEOF(arr));
 
    DECLARE_TYPE(double);
    printf("double type size: %d\n", SIZEOF(newvar));
 
    return 0;
}
 
OUTPUT
======
double var size: 8
double type size: 8
int arr[10] size : 40
double type size: 8

Last Word

Hope you have enjoyed reading the C program implementing sizeof operator using macro. Please do write us if you have any suggestion/comment or come across any error on this page. Thanks for reading!




Get Free Tutorials by Email

About the Author

is the main author for cs-fundamentals.com. He is a software professional (post graduated from BITS-Pilani) and loves writing technical articles on programming and data structures.

Today's Tech News

Amazon resists Echo murder evidence callPosted on Thursday February 23, 2017

Amazon issues formal legal response to requests to hand over information from its smart speaker Echo.

Router hacker suspect arrested at Luton AirportPosted on Thursday February 23, 2017

The "mastermind" behind a massive 2016 attack may face sabotage charges in Germany.

A guided tour of the cybercrime undergroundPosted on Wednesday February 22, 2017

Malware researcher Anton talks about who does what in the web's dark marketplaces.

Courtesy BBC News