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
。
请注意,指针只是一个表示内存地址的值,它不包含任何有关您分配了多少内存块的信息(实际上无法找出分配的大小时只有指针)。
以下到底是什么意思?
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
。
请注意,指针只是一个表示内存地址的值,它不包含任何有关您分配了多少内存块的信息(实际上无法找出分配的大小时只有指针)。