我正在阅读其中一个在不使用sizeof()的情况下找出变量大小的实现 以下是实施
int i = 1;
size_t size = (char*)(&i+1)-(char*)(&i);
printf("%zi\n", size);
但我不明白为什么varibale i的地址类型被转换为(char *)而不是(int *)。
任何人都可以帮助我理解这种种姓在这里的运作方式吗?
答案 0 :(得分:8)
(char*)
的强制转换意味着差异是在char
指针算术中计算的。结果size
将以char
为单位(即字节),这是sizeof
的自然单位。
答案 1 :(得分:3)
char
的大小保证为1.如果将指针从int
转换为char
,当你减去两个指针时,你会得到它们之间的不同,这将是以char
为单位,而不是int
的大小。它有助于计算int
的实际大小。
答案 2 :(得分:2)
size_t size = (char*)(&i+1)-(char*)(&i);
这里因为i
是整数指针,& i + 1会将指针递增到int
类型变量的下一个地址。因此,此增量将导致地址增量乘以存储int
数据所需的字节数。但如果直接减去该值,它将给出指针之间的int数据数而不是字节数。因此,要获取您键入的字节数,请将指针强制转换为大小为字节的数据类型
您甚至可以将其转换为整数并获得差异以获得int
的大小,即字节数。但它会导致警告,所以不是一个好的做法。
答案 3 :(得分:0)
根据指向的数据类型的大小,加法和减法对指针的行为都不同。
例如,假设在特定计算机的给定编译器中,char
占用1个字节,short
占用2个字节,long
占用4个字节。
假设我们定义了以下变量:
char *pChar;
short *pShort;
long *pLong;
并且我们知道他们分别指向内存位置1000,2000和3000,所以如果我们写:
pChar++; // As expected, pChar will contain the value 1001
pShort++; // pShort will contain the value 2002, because short type will take 2 bytes
pLong++; // pLong will contain the value 3004
回到问题中的代码,根据指针算法,变量大小将包含i
的大小(在本例中为int
),无论转换为(char *)还是(int *)