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

Robotic barman pours Rory a pintPosted on Friday March 24, 2017

The BBC’s technology correspondent Rory Cellan-Jones gets a beer poured for him by a robotic barman - but how long does it take?

Row over US ISP customer data salesPosted on Friday March 24, 2017

US politicians have voted to let ISPs gather and sell data about what Americans do online.

Ofcom plans instant payback for broadband woesPosted on Friday March 24, 2017

Customers who suffer poor service could get automatic payouts under Ofcom's plan.

Courtesy BBC News