为什么struct给出错误的sizeof和void指针 为什么sizeof给出了错误的输出 无效指针是什么意思?为什么是4字节

为什么struct给出错误的sizeof和void指针 为什么sizeof给出了错误的输出 无效指针是什么意思?为什么是4字节,c,C,在此代码中: struct s1 { int p; void *q; char r; }; struct s2 { int p; char r; void *q; }; int main() { struct s1 s; struct s2 r; printf("%d %d",sizeof(s),sizeof(r)); printf("\n"); printf("%d %d %d",sizeof(int),s

在此代码中:

struct s1
{
    int p;
    void *q;
    char r;
};
struct s2
{
    int p;
    char r;
    void *q;
};
int main()
{
    struct s1 s;
    struct s2 r;
    printf("%d %d",sizeof(s),sizeof(r));
    printf("\n");
    printf("%d %d %d",sizeof(int),sizeof(char),sizeof(void*));
    return 0;
}
我得到的输出是12,但我认为
sizeof
应该给出9作为答案


我在许多帖子中都听说过这种填充是什么?

它没有给出错误的输出。系统上int的大小是4,void指针的大小也是4,虽然char通常可以是8位长,但结构本身不会是9字节长,因为大多数系统至少是32位的,因此编译器将它们“填充”为4字节的倍数。
空指针只是一个可以指向任何东西的指针。

是的,填充,你听说过,你试过谷歌吗?如果你用谷歌搜索,有很多有用的结果,例如,c结构填充返回类型的可能重复的
sizeof
size\t
,它是一种无符号类型,你需要
%zu
来打印它。下一次打印错误格式是不明确的行为,而不是询问编译器为什么出错,请考虑替换源代码。建议重新格式化代码的工作(参见我的编辑)。