实现sizeof运算符

我已经尝试实施sizeof运算符..我已经这样做了..

#define my_sizeof(x) ((&x + 1) - &x) 

但是最终总是以任一数据types给出结果为'1'。

我已经为此search了它..我发现代码typecasted

 #define my_size(x) ((char *)(&x + 1) - (char *)&x) 

而代码工作,如果它是typecasted ..我不明白为什么..这个代码也填充结构完美..

它也在为

 #define my_sizeof(x) (unsigned int)(&x + 1) - (unsigned int)(&x) 

任何人都可以请解释它是如何工作,如果typecasted,如果没有typecasted?

提前致谢..

Solutions Collecting From Web of "实现sizeof运算符"

指针减法的结果是在元素中 ,而不是以字节为单位。 因此,第一个表达式按照定义评估为1

除此之外,你真的应该在宏中使用圆括号:

 #define my_sizeof(x) ((&x + 1) - &x) #define my_sizeof(x) ((char *)(&x + 1) - (char *)&x) 

否则,在表达式中尝试使用my_sizeof()会导致错误。

但总是以数据类型的结果为“1”结束

是的,这就是指针算法的工作原理。 它以所指向的类型为单位进行工作。 所以铸造到char *工程单位的char ,这是你想要的。

sizeof运算符是C(和C ++)语言规范的一部分,在编译器(前端)中实现。 没有办法用其他C构造来实现它(除非你使用类似typeof的 GCC扩展),因为它可以接受任何类型或表达式作为操作数,而不会产生任何副作用(例如sizeof((i>1)?i:(1/i))不会崩溃,当i==0但你的宏my_sizeof将崩溃与零除)。 另请参阅C编码准则和维基百科 。

您应该了解C 指针算术 。 看到这个问题 。 指针差异以元素而不是字节表示。

 #define my_sizeof(x) ((char *)(&x + 1) - (char *)&x) 

在以下情况下,这个my_sizeof()宏不起作用:

  1. sizeof 1 – 4字节(对于4字节int的平台)
    my_sizeof(1) – 根本不会编译。

  2. sizeof (int) – 4字节(用于4字节int的平台)
    my_sizeof(int) – 根本不会编译代码。

它只能用于变量。 它不适用于像intfloatchar等数据类型,像2,3.4, 'A'等文字,也不适用于像a+bfoo()这样a+b右值表达式。

 #define my_sizeof(x) ((&x + 1) - &x) 

&x给出程序中声明的变量的地址(可以说是double x),并用1递增它给出地址,其中类型x的下一个变量可以被存储(这里addr_of(x) + 8 ,大小为a双是8Byte)。

不同的结果是x的类型有多少个变量可以存储在这个内存量中,对于x类型来说显然是1(用1来递增,而不同的是我们所做的)。

 #define my_size(x) ((char *)(&x + 1) - (char *)&x) 

将其转换为char* ,并将差异告诉我们在给定的内存空间中可以存储多少个类型为char变量(差异)。 由于每个char仅需要1字节的内存,因此(内存量)/ 1将给出传递给宏的变量类型的两个连续内存位置之间的字节数,因此x类型的变量需要。

但是你不能将任何文字传递给这个宏,并知道它们的大小。

#define my_sizeof(x)((&x + 1) – &x)

&x给出你的变量的地址,并用一个(&x + 1)递增它,给出地址,在那里可以存储另一个x类型的变量。 现在,如果我们对((&x + 1) – &x)这些地址进行算术运算,那么它将会告诉在((&x + 1) – &x)地址范围内,可以存储1个x类型的变量。

现在,如果我们使用(char *)[因为char的大小是1个字节并且增加一个char *只会移动一个字节]来对这些内存进行类型转换,那么我们将得到类型x消耗的字节数