如何在不创建变量或指针或使用数据类型的sizeof的情况下找到数据类型的大小?

mad*_*ddy 12 c

下面显示的问题是面试问题

问)你有一个数据类型,比如说C中的X.

要求是获取数据类型的大小,而不声明该类型的变量或指针变量,

而且,当然不使用sizeof运算符!

我不确定此问题是否曾在SO中提出过.

谢谢并问候Maddy

The*_*hea 17

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/


Fra*_*ack 16

这应该做的伎俩:

#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;
}
Run Code Online (Sandbox Code Playgroud)

解释 size_t size = (size_t)(((X*)0) + 1);

  • 假设a 因为对齐sizeof(X)而返回12(0x0c)
  • ((X*)0)制作一个指向X内存位置0 的指针(0x00000000)
  • + 1将指针增加一个类型元素的大小X,因此指向0x0000000c
  • 表达式(size_t)()将表达式转换为(((X*)0) + 1)整数类型(size_t)

希望能给出一些见解.

  • 无效指针上的指针算法会产生未定义的行为('void main'和使用错误的printf转换说明符也是如此). (4认同)
  • @Thomas:不,即使读取无效指针的值也已经是未定义的行为.请参阅fizzer给出的链接中的第49页:"无论如何创建无效指针,任何使用它都会产生未定义的行为." 根据标准,附件J.2:"在以下情况下,行为未定义:[...]使用指向生命周期结束的对象的指针的值(6.2.4)."*使用*,而不是解除引用. (3认同)

小智 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;
    }
Run Code Online (Sandbox Code Playgroud)