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

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

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

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

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

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

Спасибо и всего наилучшего Мэдди

Ответы [ 5 ]

17 голосов
/ 12 мая 2010

определить sizeof_type (тип) (size_t) ((тип *) 1000 + 1) - (size_t) ((тип *) 1000)

Оригинал из этой дискуссии. http://www.linuxquestions.org/questions/programming-9/how-to-know-the-size-of-the-variable-without-using-sizeof-469920/

16 голосов
/ 12 мая 2010

Это должно сработать:

#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 голосов
/ 12 мая 2010

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

struct outer
{
     X x;
     char after;
};

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

Смещение макроса может быть определено как

#define offsetof(S, f) ((size_t)(&((S *)0)->f))
1 голос
/ 12 мая 2010

Вы можете набрать 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;
    }
0 голосов
/ 12 марта 2013
printf("%d",(int)(&x+1)-(int)&x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...