Search code examples
cpointersdynamic-memory-allocation

calloc sometimes gives double the amount of memory asked


I came across something I don't understand why and I'd like to hear an explanation about it. I have this struct:

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

int main()
{
    Student **test1 = calloc(2, sizeof(*test1));
    Student **test2 = calloc(2, sizeof(**test2));
    return 0;
}

I've noticed that test1 gets 2 memory allocations (as it should) while test2 gets 4. Why is that and which is the correct usage? I assume its the first one but i'm not sure why.

Thanks!


Solution

  • sizeof(*test1) is the size of a pointer Student*, while sizeof(**test) is the size of a structure Student.The structure has a pointer, so its size should be larger than the size of a pointer.

    Student **test1 = calloc(2, sizeof(*test1));
    

    Is the typical usage. This is allocating 2-element array of Student* and assigning the pointer to its first element to test1.