我正在研究这个malloc函数,我可以使用一些帮助:
static void *malloc(int size)
{
void *p;
if (size < 0)
error("Malloc error");
if (!malloc_ptr)
malloc_ptr = free_mem_ptr;
malloc_ptr = (malloc_ptr + 3) & ~3; /* Align */
p = (void *)malloc_ptr;
malloc_ptr += size;
if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
error("Out of memory");
malloc_count++;
return p;
}
我知道malloc func为任何类型分配内存空间,如果有足够的内存,但我不理解的行是:
p = (void *)malloc_ptr;
malloc_ptr += size;
它如何指向任何类似的数据类型?我只是无法理解void指针或其位置。
注意:malloc_ptr是无符号长
答案 0 :(得分:5)
它返回void指针的原因是因为它不知道你在malloc
调用中分配了什么空间。它只知道你要求的空间量。由您或您的编译器决定将填充内存的内容。 void指针的位置通常实现为链接列表,以保持完整性并知道哪些内存值是空闲的,这在free
函数中令人惊讶地跟踪。
答案 1 :(得分:2)
这是malloc
的实现,因此允许执行在常规程序中不合法的事情。具体而言,它正在使用从unsigned long
到void *
的实现定义转换。程序初始化将malloc_ptr
设置为大块未分配内存的数字地址。然后,当您要求分配时,malloc
会使指针超出malloc_ptr
的当前值,并按您要求的字节数增加malloc_ptr
。这样,下次调用malloc
时,它将返回一个新指针。
这是malloc
最简单的实现方式。最值得注意的是,似乎没有重用已释放的内存。
答案 2 :(得分:1)
Malloc正在为一块完全非结构化的平坦内存返回一个指针。 (void *)指针意味着它不知道它指向的是什么(没有结构),只是它指向一些大小合适的内存。
在调用malloc之外,您可以告诉程序该指针有一些结构。即,如果您有结构some_struct
,您可以说:struct some_struct *pStruct = (struct some_struct *) malloc(sizeof(struct some_struct))
。
看看malloc如何只知道它要分配的大小,但实际上并不知道它的结构?您对malloc的调用没有传递有关结构的信息,只传递了要分配的内存大小。
这是C的通用方式:malloc会返回一定数量的内存,你的工作就是把它投射到你需要的结构化内存中。
答案 3 :(得分:1)
p = (void *)malloc_ptr;
`malloc` returns a void pointer, which indicates that it is a pointer to a region of
unknown data type. The use of casting is only required in C++ due to the strong type
system, whereas this is not the case in C. The lack of a specific pointer type
returned from `malloc` is `type-unsafe` behaviour according to some programmers:
malloc allocates based on byte count but not on type.
malloc_ptr += size;
`C` implicitly casts from and to `void*`, so the cast will be done automatically. In
`C++` only conversion to void* would be done implicitly, for the other direction an
explicit cast is required.
关于类型转换的Wiki解释,
`malloc` function returns an untyped pointer type `void *`, which the calling code must
cast to the appropriate pointer type. Older C specifications required an explicit cast
to do so, therefore the code `(struct foo *) malloc(sizeof(struct foo))` became the
accepted practice. However, this practice is discouraged in ANSI C as it can mask a
failure to include the header file in which `malloc` is defined, resulting in
downstream errors on machines where the int and pointer types are of different sizes,
such as the now-ubiquitous x86_64 architecture. A conflict arises in code that is
required to compile as C++, since the cast is necessary in that language.
答案 4 :(得分:1)
如你所见,这两行,
p = (void *)malloc_ptr;
malloc_ptr += size;
这里你的malloc_ptr类型为unsigned long,因此我们将此变量类型转换为void类型,然后将其存储在p中。 并且以类似的方式,第二个表示malloc_ptr = malloc_ptr + size;
这两个代码都是为了开发人员的舒适性,因为p是void指针类型所以在应用程序中使用malloc然后你不知道哪个类型的内存块必须通过函数返回,所以这个函数总是返回这个泛型void指针,因此我们可以根据需要在我们的应用程序中再次进行类型转换。
和第二个代码中的相同,如果您输入的是负数,那么这个条件会发生什么
if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
error("Out of memory");