void * malloc中的malloc的精确操作(size_t size);

时间:2017-04-11 12:10:04

标签: c dynamic-memory-allocation

以下内容究竟是什么意思?

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

这是否意味着操作系统将一个23字节的内存分配给int(虽然它只需要4个字节)?我知道要使malloc平台独立,我们使用sizeof,但是如果我们使用上面的语法呢?

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

4 个答案:

答案 0 :(得分:2)

当您致电malloc(23)时,它会返回 至少 23个字节(可能更多)。

你使用的空间完全取决于你。你想在其中添加int吗?这是你的事,但你浪费了19个字节。你想在那里放一个22字节的字符串?细

sizeof衡量您提供的TYPE的大小。它不知道可以在它后面分配多少内存。因此,当您致电sizeof(*p)时,它会看到*p的类型为intint的大小为4,因此结果为4.

没有可移植的,被广泛接受的方式来知道已经为指针分配了多少内存。

答案 1 :(得分:1)

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

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

请注意,指针只是一个表示内存地址的值,并且它不包含任何有关此内存块已分配多大的信息(实际上只有在没有时才能找到这个分配的大小指针)。

答案 2 :(得分:0)

malloc()返回的指针不随身携带"有关原始分配大小的任何信息。它们只是指针,他们只能说是内存中的地址。没什么。

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

它浪费了记忆,并且对于阅读代码的任何人来说都非常混乱(因为:重点是什么?!)但是根据语言的规范,它会起作用并且是正确的。

推荐以下用法:

int *p = malloc(sizeof *p);

此:

  • 放弃毫无意义的演员。
  • 仅分配单个int所需的金额。

请注意,这(与对malloc()的任何调用一样)可能会返回超过sizeof (int)个字节的可用内存,但您不能超出您要求的金额,以便无所谓。

答案 3 :(得分:0)

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

假设int为4个字节,则可以有5个额外3个字节的空间。

至于sizeof运算符,它对动态分配的内存一无所知。它只能看到给定表达式的类型。由于*pint,因此它将始终返回4(同样,假设您的平台上int为4个字节。