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