C中带指针的结构的内存开销

C中带指针的结构的内存开销,c,pointers,memory,C,Pointers,Memory,我意识到当我的结构包含指针时,会有内存开销。这里有一个例子: typedef struct { int num1; int num2; } myStruct1; typedef struct { int *p; int num2; } myStruct2; int main() { printf("Sizes: int: %lu, int*: %lu, myStruct1: %lu, myStruct2: %lu\n", sizeof(int),

我意识到当我的结构包含指针时,会有内存开销。这里有一个例子:

typedef struct {
    int num1;
    int num2;
} myStruct1;

typedef struct {
    int *p;
    int num2;
} myStruct2;

int main()
{
    printf("Sizes: int: %lu, int*: %lu, myStruct1: %lu, myStruct2: %lu\n", sizeof(int), 
        sizeof(int*), sizeof(myStruct1), sizeof(myStruct2));
    return 0;
}
这将在我的64位计算机中打印以下内容:

Sizes: int: 4, int*: 8, myStruct1: 8, myStruct2: 16
除了
myStruct2
的大小之外,一切对我都有意义,我认为它的大小应该是12而不是16(
sizeof(int*)+sizeof(int)=12

谁能解释一下为什么会发生这种情况? 谢谢大家!

(我很确定这一定是在其他地方问过的,但我找不到。)

这是填充标准说在结构中可能有未命名的填充,或者在结尾,但不是在开头。C99标准草案第6.7.2.1节《结构和联合规范》第13段规定:

[…]结构对象中可能有未命名的填充,但在其开始处没有

第15段说:

结构或联合的末尾可能有未命名的填充


可能是8字节的打包/对齐吗?请您详细说明编译器的对齐设置好吗?我认为这不是8字节对齐,因为一个正好包含3个整数的结构的大小是12.yay,谢谢!现在我很好奇:为什么会发生这种事?@Urinito就我所知,这一直都是关于这个问题的,而且这个问题更相关。