Malloc和Void Pointers

时间:2012-12-25 19:17:48

标签: c malloc void-pointers

我正在研究这个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是无符号长

5 个答案:

答案 0 :(得分:5)

它返回void指针的原因是因为它不知道你在malloc调用中分配了什么空间。它只知道你要求的空间量。由您或您的编译器决定将填充内存的内容。 void指针的位置通常实现为链接列表,以保持完整性并知道哪些内存值是空闲的,这在free函数中令人惊讶地跟踪。

答案 1 :(得分:2)

这是malloc实现,因此允许执行在常规程序中不合法的事情。具体而言,它正在使用从unsigned longvoid *的实现定义转换。程序初始化将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");