这段代码如何计算数据类型的sizeof?

时间:2011-02-12 06:06:32

标签: c

#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#define My_Sizeof(type) ((char*)((type*)0 +1) - (char*)(type*)0)
void main()
{
    char a='1';
    int b=My_Sizeof(int);
    printf("size is %d",b);
    _getch();
}

//任何人都可以帮我理解宏来计算sizeof char数据类型吗?

2 个答案:

答案 0 :(得分:3)

将它分解成一口大小的碎片,以下伪函数实现了相同的结果:

size_t My_Sizeof(type) {
    type* elem0 = (type*)0;
    type* elem1 = (type*)0 + 1;
    char* elem0_addr = (char*)elem0;
    char* elem1_addr = (char*)elem1;
    return elem1_addr - elem0_addr;
}

该表达式计算名义上位于空指针地址的双元素数组中的元素的地址。然后它将地址转换为char *和subtracts,这将产生两个地址之间的差异,以字节为单位。

答案 1 :(得分:3)

分解:

#define My_Sizeof(type) ((char*)((type*)0 +1) - (char*)(type*)0)

(char*)(type*)0为零

(type*)0 +1使用(type *)类型的指针进行指针运算,因此(type *)0 + 1将成为偏移量的指针0 + 1 * sizeof(type) = sizeof(type)字节

如果差异为(type *),差异为1。如果对(char *)这两种类型进行区分,则差异为sizeof(T) - 0 = sizeof(T)