C | find the size of the value a void Pointer is pointing at using sizeof()

Viewed 362

Im trying to use sizeof() to find the size of the value a void pointer is pointing at, I want to use it to print the value.

this code

    int num = 5;
    void *voidPtr;
    voidPtr = #
    printf("%d", sizeof(*voidPtr));

Prints, 1. How can i get it to print 4?

If theres any other way to print the value of the void pointer, please let me know

Thanks in advance.

5 Answers

The value of pointer merely conveys the starting address of an object, not any information about its size.

The type of a pointer inherently conveys information about the size of the object it points to, if it is a complete type. However, void is incomplete, and a void * provides no information about the size of the object it originated from (except possibly by extensions to standard C and by debugging features).

Generally, if your program needs to know the size of what a void * points to, it must track that information itself.

  1. *voidPtr is invalid in standard C. It is a GCC extension and that is the reason why sizeof(*voidptr) is 1. Any other (non GCC family) compiler will not compile this code.

  2. %d is the wrong format to print size_t. You should use %zu instead.

  3. There is no way in C to determine what size object is referenced by the void pointer

The type void is an incomplete type. It means that the size of an expression of the type void is undefined.

From the C Standard (6.2.5 Types)

19 The void type comprises an empty set of values; it is an incomplete object type that cannot be completed

and (6.5.3.4 The sizeof and alignof operators)

1 The sizeof operator shall not be applied to an expression that has function type or an incomplete type, ...

Some compilers for back compatibility make sizeof( void ) equal to sizeof( char ) that is to 1.

If you need to get the size of the pointed object using a pointer of the type void * then you need to cast the pointer to the pointer of the referenced object type as for example

printf("%zu", sizeof( *( int * )voidPtr));

Pay attention to that you need to use the conversion specifier %zu with expressions of the type size_t.

I guess you think for this:

printf( "%d", sizeof voidPtr );

It is the size of voidPtr variable, not the pointed value *voidPtr. sizeof voidPtr will be 4 if program is compiled as 32-bit. PS: sizeof does not need parenthesis when used with variable/object, not type. E.g. sizeof MyVariable vs sizeof (long).

You said, "I'm trying to find the size of the value a void pointer is pointing at", is pointing to an integer in your code, so use this:

printf("%d", sizeof(int));

Understand that 'sizeof()' must know the type at compile time.

Related