Как вы можете найти размер типа данных, не создавая переменную или указатель, или используя sizeof типа данных?
Вопросы, показанные ниже, являются вопросом интервью
Q) У вас есть тип данных, например X в C.
Требование состоит в том, чтобы получить размер типа данных, не объявляя
переменной или переменной указателя этого типа,
И, конечно, без использования оператора sizeof!
Я не уверен, был ли задан этот вопрос раньше в SO.
Спасибо и приветствую
Maddy
Ответы
Ответ 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;
}
Ответ 2
define sizeof_type (type) (size_t) ((type *) 1000 + 1) - (size_t) ((type *) 1000)
Оригинал из этого обсуждения.
http://www.linuxquestions.org/questions/programming-9/how-to-know-the-size-of-the-variable-without-using-sizeof-469920/
Ответ 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