How can you find the size of a datatype without creating a variable or pointer, or using sizeof of the datatype?

后端 未结 5 398
没有蜡笔的小新
没有蜡笔的小新 2021-02-04 09:37

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 decl

相关标签:
5条回答
  • 2021-02-04 09:54

    Declare a structure with a member of that type, then use offsetof to compute the size?

    struct outer
    {
         X x;
         char after;
    };
    

    offsetof(outer, after) should give you the (aligned) size of x. Note that I'm not declaring a variable of that type per se, nor a pointer to the type, but I'm including it as a member of a structure declaration, where I measure the location of the member that comes after it.

    The offsetof macro can be defined as

    #define offsetof(S, f) ((size_t)(&((S *)0)->f))
    
    0 讨论(0)
  • 2021-02-04 10:05

    You can typecast 0 (or any arbitrary value) to type datatype X* to find the size of the datatype, just like the below example:

        #include <stdio.h>
    
        struct node{
            char c;
            int i;
        };
    
        int main()
        {
            printf("Sizeof node is: %d\n", ((char *)((struct node *)0 + 1) - (char *)((struct node *)0)));   
    // substract 2 consecutive locations starting from 0 that point to type node, 
    //typecast these values to char * to give the value in number of bytes.
            return 0;
        }
    
    0 讨论(0)
  • 2021-02-04 10:11

    define sizeof_type( type ) (size_t)((type*)1000 + 1 )-(size_t)((type*)1000)

    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/

    0 讨论(0)
  • 2021-02-04 10:18

    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);

    • assuming a 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
    • the expression (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.

    0 讨论(0)
  • 2021-02-04 10:19
    printf("%d",(int)(&x+1)-(int)&x
    
    0 讨论(0)
提交回复
热议问题