我通过这个程序来查找结构的长度而不使用sizeof。我有一些问题,我找不到答案。
我无法理解这一步(char*)(p+1)-(char*)p)
- 为什么指针被类型化为char。
我打印出每种数据类型的大小。所以,结构的大小应该是3 *大小的int +大小的浮点数+大小的char = 17.但是,结构的大小是20.请解释如何。
为什么(float*)(p+1)-(float*)p)
的输出为5。
代码:
#include<stdio.h>
struct sample
{
int a,b;
float c;
char z;
int k;
};
void main()
{
struct sample *p;
struct sample x;
printf("size of struct w/o using sizeof: %d\n", (char*)(p+1)-(char*)p);
printf("size of struct w/o using sizeof: %d\n", (float*)(p+1)-(float*)p);
printf("size of struct using sizeof: %d\n", sizeof(struct sample));
printf(" %d %d %d %d\n", sizeof(char), sizeof(int), sizeof(float), sizeof(x));
}
输出:
结构的大小w / o使用sizeof:20
结构大小w / o使用sizeof:5
使用sizeof的结构大小:20
1 4 4 20
4)谢谢你的回答。我还有一个疑问。
码
struct sample
{
int a,b;
float c;
char z;
int k;
char s;
};
填充后,此结构的大小为24个字节。为什么在float (float)((float*)(p+1)-(float*)p)
中打印它不会给出5.8000而不是6.
答案 0 :(得分:2)
以字节为单位转换将为您提供两个指针之间的字节差异
您的结构获取填充以与4字节边界对齐。在您的结构中,真正的大小将如下(包括填充)
struct sample
{
int a,b; // 8 bytes, 4 bytes each
float c; // 4 bytes
char d; // 4 bytes, 1 byte + 3 padding
int k; // 4 bytes
}
转换为float将为您提供浮点数中的sizeof结构(5个浮点数= 20个字节)
答案 1 :(得分:1)
Typecasted to(char *)因为你想以char(字节)打印大小。当你递增p时,它将按p的大小递增。所以(p + 1)-p是结构的大小,(char *)帮助以字节为单位打印它。
了解结构对齐和填充
5因为这个时候它的类型为(float *),因为你想以float(4字节)为单位打印大小。当你递增p时,它将按p的大小递增。所以(p + 1)-p是结构的大小,(float *)帮助以浮点数(4个字节)打印它。
答案 2 :(得分:0)
即使(char*)(p+1) - (char*)p)
承诺不使用sizeof *p
,它也会隐式地这样做,因为指向p的指针乘以它们各自类型的大小......。 C99中提到了这一点:http://www.iso-9899.info/n1256.html#FOOTNOTE.91
许多cpu架构,包括intel x86
系列处理器需要在一个地址上读取它们的多字节整数,这些整数可以被它们的大小整除,例如对于4字节类型,地址必须是均匀的这意味着,当你的struct
创建一个数组时,即使你{{1},第二个元素的int
必须也可以被4整除最后。这就是为什么在那里添加填充并包含在结构的总大小中的原因。
此结果是结构的大小除以char
类型的大小。因为我们现在知道你的struct的大小是20,float
计算到p之后20个字节的地址,但是然后它被转换为p+1
,它将偏移量除以适合的浮点数进入区间。