calloc有时会提供两倍于所请求的内存量

calloc有时会提供两倍于所请求的内存量,c,pointers,dynamic-memory-allocation,C,Pointers,Dynamic Memory Allocation,我遇到了一些我不明白为什么的事情,我想听听关于它的解释。 我有这个结构: typedef struct Student { int age; char *name; } Student; int main() { Student **test1 = calloc(2, sizeof(*test1)); Student **test2 = calloc(2, sizeof(**test2)); return 0; } 我注意到test1得到了2个内存分配

我遇到了一些我不明白为什么的事情,我想听听关于它的解释。 我有这个结构:

typedef struct Student {
    int age;
    char *name;
} Student;

int main()
{
    Student **test1 = calloc(2, sizeof(*test1));
    Student **test2 = calloc(2, sizeof(**test2));
    return 0;
}
我注意到test1得到了2个内存分配,而test2得到了4个。为什么会这样?正确的用法是什么?我想这是第一个,但我不知道为什么

谢谢

这里有两件事:

您在这里分配了两个不同的内存量。在第一种情况下,为2个Student*类型的对象分配空间,而在第二种情况下,为2个Student类型的对象分配空间。后者可能比前者大,因此您可以在那里放置更多Student*类型的对象。 您不会显示如何验证已获得的内存量,而是要读取或写入超出分配内存边界的内存。您的程序可能会崩溃,也可能不会。 sizeof*test1是指针学生*的大小,而sizeof**test是结构学生的大小。结构有指针,因此其大小应大于指针的大小

Student **test1 = calloc(2, sizeof(*test1));
这是典型的用法。这是分配Student*的2元素数组,并将指向其第一个元素的指针分配给test1。

sizeof*test是指向Student*的指针的字节大小。它将出现在大多数系统4或8上

sizeof**test提供学生的大小。分配测试2毫无意义

通过打印尺寸,您可以轻松测试:

#include <stdio.h>
#include <malloc.h>

typedef struct Student {
    int age;
    char *name;
    double somedata[100];
} Student;

int main()
{
    Student **test1;
    Student **test2;

    printf("%zu\n", sizeof(*test1));
    printf("%zu\n", sizeof(**test2));
    return 0;
}

为什么在sizeof调用中,test1前面有一个星号,test2前面有两个星号?首先,你怎么知道?第二,你使用双星指针有什么原因吗?你怎么知道calloc有时会提供双倍的内存量?您的程序没有显示任何内容。我注意到,通过在调试模式下跟踪指针。至于用法,它与我的程序有关。这只是一个示例。您的实际问题也是:为什么sizeof*test1的值与sizeof**test2的值不同?我刚刚注意到,在调试时,当我向*test+1、*test+2添加观察者时,。。。我看到有多少“单元格”在calloc之后为空。谢谢