calloc 有时会提供双倍的内存请求量

calloc sometimes gives double the amount of memory asked

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

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 个。为什么会这样?哪个是正确的用法?我假设它是第一个,但我不确定为什么。

谢谢!

这里有两件事:

  1. 您在这里分配了两个不同数量的内存。在第一种情况下,您为 2 个 Student * 类型的对象分配 space,而在第二种情况下,您为 2 个 Student 类型的对象分配 space。后者可能比前者大,因此您可以在其中放置更多 Student * 类型的对象。
  2. 您没有显示您是如何验证已获得多少内存的,但是 undefined behavior 读取或写入超过分配内存的界限。您的程序可能会崩溃,也可能不会。

sizeof(*test1)是一个指针的大小Student*,而sizeof(**test)是一个结构Student的大小。结构有一个指针,所以它的大小应该大于指针的大小。

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

是典型用法。这是分配 Student* 的 2 元素数组并将指向其第一个元素的指针分配给 test1.

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

sizeof(**test)给你Student的大小。分配(test2)根本没有意义。

您可以通过打印尺寸轻松地自行测试:

#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;
}

https://godbolt.org/z/W6e8YzKKf