Подтвердить что ты не робот

Как вы можете найти размер типа данных, не создавая переменную или указатель, или используя sizeof типа данных?

Вопросы, показанные ниже, являются вопросом интервью

Q) У вас есть тип данных, например X в C.

Требование состоит в том, чтобы получить размер типа данных, не объявляя переменной или переменной указателя этого типа,

И, конечно, без использования оператора sizeof!

Я не уверен, был ли задан этот вопрос раньше в SO.

Спасибо и приветствую Maddy

4b9b3361

Ответ 1

Вы можете ввести 0 (или любое произвольное значение) для ввода типа данных X *, чтобы найти размер типа данных, как показано ниже:

    #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;
    }

Ответ 3

Это должно сделать трюк:

#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;
}

Объяснение size_t size = (size_t)(((X*)0) + 1);

  • Предполагая, что sizeof(X) вернет 12 (0x0c) из-за выравнивания
  • ((X*)0) делает указатель типа X, указывающий на ячейку памяти 0 (0x00000000)
  • + 1 увеличивает указатель на размер одного элемента типа X, поэтому указывая на 0x0000000c
  • выражение (size_t)() выводит адрес, который выражается выражением (((X*)0) + 1) обратно в интегральный тип (size_t)

Надеюсь, что это дает некоторое представление.

Ответ 4

Объявить структуру с членом этого типа, а затем использовать offsetof для вычисления размера?

struct outer
{
     X x;
     char after;
};

offsetof(outer, after) должен дать вам (выровненный) размер x. Обратите внимание, что я не объявляю переменную этого типа как таковой, не указатель на тип, но я включаю ее как член объявления структуры, где я измеряю местоположение члена, который приходит после него.

Макрос offsetof можно определить как

#define offsetof(S, f) ((size_t)(&((S *)0)->f))

Ответ 5

printf("%d",(int)(&x+1)-(int)&x