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 个。为什么会这样?哪个是正确的用法?我假设它是第一个,但我不确定为什么。
谢谢!
这里有两件事:
- 您在这里分配了两个不同数量的内存。在第一种情况下,您为 2 个
Student *
类型的对象分配 space,而在第二种情况下,您为 2 个 Student
类型的对象分配 space。后者可能比前者大,因此您可以在其中放置更多 Student *
类型的对象。
- 您没有显示您是如何验证已获得多少内存的,但是 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;
}
我遇到了一些我不明白为什么的事情,我想听听对此的解释。 我有这个结构:
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 *
类型的对象分配 space,而在第二种情况下,您为 2 个Student
类型的对象分配 space。后者可能比前者大,因此您可以在其中放置更多Student *
类型的对象。 - 您没有显示您是如何验证已获得多少内存的,但是 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;
}