C 为什么指针在这里被键入字符?
我通过这个程序来查找结构的长度,而不使用sizeof。我有些问题找不到答案C 为什么指针在这里被键入字符?,c,pointers,type-conversion,C,Pointers,Type Conversion,我通过这个程序来查找结构的长度,而不使用sizeof。我有些问题找不到答案 我无法理解这一步(char*)(p+1)-(char*)p)-指针被类型转换为char的原因 我打印出了每个数据类型的大小。因此,结构的大小应该是3*size of int+size of float+size of char=17。但是,结构的大小是20。请解释一下 为什么(float*)(p+1)-(float*)p)的输出为5 代码: #include<stdio.h> struct sample {
(char*)(p+1)-(char*)p)
-指针被类型转换为char的原因(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));
}
填充后,此结构的大小将为24字节。为什么在float(float)((float*)(p+1)-(float*)p)
中打印此项不会得到5.8000而不是6
(char*)(p+1)-(char*)p)
承诺不使用sizeof*p
,它也会隐式地这样做,因为指向p的指针会乘以大小。。。它们各自的类型。C99中提到了这一点:x86
系列处理器,都需要在可被其大小均匀整除的地址读取多字节整数,例如,对于4字节类型,地址必须可被4均匀整除。这意味着,当为结构创建数组时,第二个元素的int
s也必须可以被4整除,即使char
位于末尾。这就是为什么在那里添加了填充并包含在结构的总大小中
float
类型的大小。因为我们现在知道结构的大小是20,p+1
的计算结果是p后面20个字节的地址,但随后它被转换为float*
,它将偏移量除以适合间隔的浮点数(char*)(p+1)-(char*)p)
承诺不使用sizeof*p
,它也会隐式地这样做,因为指向p的指针会乘以大小。。。它们各自的类型。C99中提到了这一点:x86
系列处理器,都需要读取地址为d的多字节整数
struct sample
{
int a,b;
float c;
char z;
int k;
char s;
};
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
}