The question shown below is an interview question:
Q) You are given/have a datatype, say X in C.
The requirement is to get the size of the datatype, without declaring a variable or a pointer variable of that type,
And of course, without using sizeof operator !
I am not sure if this question has already been asked on SO.
Thanks and regards Maddy
2^(n-1) is the formula to find the maximum of an INT data type. In the preceding formula N (Size in bits) is the size of data type. The ^ operator calculates the power of the value. The range of an int data type is -2,147,483,648 to 2,147,483,647.
The idea is to use pointer arithmetic ( (&(var)+1) ) to determine the offset of the variable, and then subtract the original address of the variable, yielding its size. For example, if you have an int16_t i variable located at 0x0002 , you would be subtracting 0x0002 from 0x0006 , thereby obtaining 0x4 or 4 bytes.
*(a+1) => Dereferencing to *(&a + 1) gives the address after the end of the last element. *(a+1)-a => Subtract the pointer to the first element to get the length of the array. Print the size. End.
The original is from this discussion. http://www.linuxquestions.org/questions/programming-9/how-to-know-the-size-of-the-variable-without-using-sizeof-469920/
This should do the trick:
#include <stdio.h>
typedef struct
{
int i;
short j;
char c[5];
} X;
int main(void)
{
size_t size = (size_t)(((X*)0) + 1);
printf("%lu", (unsigned long)size);
return 0;
}
Explanation of size_t size = (size_t)(((X*)0) + 1);
sizeof(X)
would return 12 (0x0c
) because of alignment((X*)0)
makes a pointer of type X
pointing to memory location 0 (0x00000000)
+ 1
increments the pointer by the the size of one element of type X
, so pointing to 0x0000000c
(size_t)()
casts the address, that is given by the expression (((X*)0) + 1)
back to an integral type (size_t
)Hope that gives some insight.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With