C 为什么在下面的编程中,结构显示的内存比实际内存少

C 为什么在下面的编程中,结构显示的内存比实际内存少,c,pointers,struct,sizeof,C,Pointers,Struct,Sizeof,我写了一个程序 include<stdio.h> struct record { int i; char ch[20]; }; int main() { struct record a,*b; b=&a; printf("intial pointer is %p and final is %p",b++,b); return 0; } 算法是18字节。为什么输出是这样的 算法是18字节。为什么输出是这样的 因为它是十六进制的0

我写了一个程序

include<stdio.h>
struct record
{
    int i;
    char ch[20];
};
int main()
{
    struct record a,*b;
    b=&a;
    printf("intial pointer is %p and final is %p",b++,b);
    return 0;
}
算法是18字节。为什么输出是这样的

算法是18字节。为什么输出是这样的

因为它是十六进制的
0x7fffb0455e58
-
0x7fffb0455e40
0x18
,或2410,这是您期望的结果

请注意,您的代码具有未定义的行为,因为
++b
b
在同一表达式中使用,没有将它们分隔开的序列点。您还需要将为
%p
准备的值转换为
void*
,即

printf("initial pointer is %p and final is %p", (void*)b, (void*)(b+1));
算法是18字节。为什么输出是这样的

因为它是十六进制的
0x7fffb0455e58
-
0x7fffb0455e40
0x18
,或2410,这是您期望的结果

请注意,您的代码具有未定义的行为,因为
++b
b
在同一表达式中使用,没有将它们分隔开的序列点。您还需要将为
%p
准备的值转换为
void*
,即

printf("initial pointer is %p and final is %p", (void*)b, (void*)(b+1));

它不是18个字节。它是1*16+8=24字节。我投票以主题外的形式结束这个问题,因为它是关于读取十六进制数字的。
0x7fffb0455e58-0x7fffb0455e40==0x18
它不是18字节。它是1*16+8=24字节。我投票结束这个问题,因为它是关于读取十六进制数字的。0x7fffb0455e58-0x7fffb0455e40==0x18