#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数据类型吗?
答案 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)