malloc在void *malloc(size_t size)中的具体操作;

Exact operation of malloc in void *malloc(size_t size);

以下到底是什么意思?

void *malloc(size_t size);
int *p=(int*)malloc(23);

是否意味着OS为int分配了23字节的内存(尽管它只需要4字节)?我知道为了使 malloc 平台独立,我们使用 sizeof,但是如果我们使用上面的语法呢?

此外,即使在如上所述编写 malloc 之后,当我输入 printf("%d",sizeof(*p)) 时,我得到的答案也是 4。为什么?不应该 return 23 因为那是我分配的内存吗?

当您调用 malloc(23) 时,它将 return 至少 23 个字节(可能更多)。

space 的用途完全取决于您。你想在里面放一个 int 吗?那是你的事,但你浪费了 19 个字节。你想在那里放一个 22 字节的字符串?很好。

sizeof测量你给它的TYPE的大小。它不知道它后面可能分配了多少内存。因此,当您调用 sizeof(*p) 时,它会看到 *p 的类型为 int,并且 int 的大小为 4,因此结果为 4。

没有可移植的、被广泛接受的方法来知道有多少内存分配给了一个指针。

malloc() 编辑的 return 指针不 "carry with them" 任何关于原始分配大小的信息。它们只是指针,它们只能说是内存中的地址。仅此而已。

你的代码很好,当然假设 sizeof (int) <= 23 是真的,这将适用于典型的平台。

它会浪费内存,并且让任何阅读代码的人都感到非常困惑(因为:这有什么意义?!)但是它会根据语言的规范工作并且是正确的。

我会推荐以下用法:

int *p = malloc(sizeof *p);

这个:

  • 放弃无意义的投射。
  • 只分配单个 int.
  • 所需的数量

请注意,这(就像对 malloc() 的任何调用一样)可能会 return 多于 sizeof (int) 字节的可用内存,但您不能超出您设定的数量要求所以没关系。

如果您希望 p 指向单个整数,那么 23 个字节对于所有已知的实现来说绰绰有余。另一方面,如果您为 int 数组 分配 space,您可能没有您想象的那么多。

假设 int 是 4 个字节,您有 space 5 加 3 个额外字节。

至于sizeof运算符,它对动态分配的内存一无所知。它只看到给定表达式的类型。由于 *p 是一个 int,它总是 return 4(再次假设 int 在您的平台上是 4 个字节。

malloc 至少分配您作为参数传递的字节数,即在您的情况下至少 23 个字节,并且它 returns 指向此已分配内存块的第一个字节的指针(或 NULL,如果根本无法分配内存)。

指针的类型,例如int* 然后告诉编译器如何解释这个指针指向的内存块的内容,而不管你实际分配的大小是多少。如果你有一个 int* 类型的指针,那么内存块的内容被解释为一个 int,并且一个 int 值的大小(这是 *p 的结果,即取消引用指向 int 的指针)在您的体系结构中是 4

请注意,指针只是一个表示内存地址的值,它不包含任何有关您分配了多少内存块的信息(实际上无法找出分配的大小时只有指针)。