以下内容究竟是什么意思?
void *malloc(size_t size);
int *p=(int*)malloc(23);
这是否意味着操作系统将一个23字节的内存分配给int(虽然它只需要4个字节)?我知道要使malloc平台独立,我们使用sizeof,但是如果我们使用上面的语法呢?
此外,即使在如上所述编写malloc之后,当我输入printf("%d",sizeof(*p))
时,我得到答案为4.为什么?难道它不会返回23因为那是我分配的内存吗?
答案 0 :(得分:2)
当您致电malloc(23)
时,它会返回 至少 23个字节(可能更多)。
你使用的空间完全取决于你。你想在其中添加int
吗?这是你的事,但你浪费了19个字节。你想在那里放一个22字节的字符串?细
sizeof
衡量您提供的TYPE的大小。它不知道可以在它后面分配多少内存。因此,当您致电sizeof(*p)
时,它会看到*p
的类型为int
,int
的大小为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
运算符,它对动态分配的内存一无所知。它只能看到给定表达式的类型。由于*p
是int
,因此它将始终返回4(同样,假设您的平台上int
为4个字节。