malloc和空指针(Malloc and Void Pointers)

2019-07-17 14:21发布

我正在学习这个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;

它如何可以指向这样的任何类型的数据? 我只是不明白,空指针或它的位置。

注:malloc_ptr是一个unsigned long

Answer 1:

它返回一个空指针的原因是因为它不知道你是在分配空间malloc调用。 它只知道的空间,你所要求的金额。 它是由你或你的编译器来决定什么将填补记忆。 void指针的位置通常被实现为一个链表来维护诚信,知道什么样的内存值是免费的,其令人惊讶的是在不停的轨道free功能。



Answer 2:

这是实施 malloc ,所以它被允许做的事情,也不会在常规程序是合法的。 具体而言,利用从实现定义的转换unsigned longvoid * 。 程序初始化设置malloc_ptr未分配的内存块大的数字地址 。 然后,当你问一个分配malloc使指针出的当前值的malloc_ptr并增加malloc_ptr通过你要求的字节数。 这样,下次你打电话时malloc会返回一个新的指针。

这大约是最简单的可能实现malloc 。 最值得注意的是,它似乎没有以往任何时候都重用释放内存。



Answer 3:

malloc的是为完全非结构化的,平面内存的块返回一个指针。 该(无效*)指针意味着它不知道它的指向(无结构),只是它指向大小尺寸的一些内存。

你的电话对malloc之外,你可以再告诉你的程序,这个指针有一定的结构。 也就是说,如果你有一个结构some_struct你可以说: struct some_struct *pStruct = (struct some_struct *) malloc(sizeof(struct some_struct))

怎么看的malloc只知道它是要分配的大小,但实际上并不知道它的结构? 您对malloc的调用传递没有关于结构的信息,多少内存分配只是大小。

这是成为通用的C的方式:的malloc会返回一个一定量的内存,它是你的工作,将它转换为你需要的结构化存储。



Answer 4:

 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.

维基有关类型转换的解释,

`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.


Answer 5:

正如你看到这两条线,

p = (void *)malloc_ptr;
malloc_ptr += size;

在这里你有型无符号的malloc_ptr长,所以我们是类型转换这个变量为void类型,然后将其存储在页。 和以类似的方式第二个是表示malloc_ptr = malloc_ptr +大小;

而这两个代码的开发人员的comfortness为p的类型为void指针,以便在应用程序时,您使用malloc,你不知道哪种类型的内存块必须由函数返回所以这个功能总是返回该通用的空指针,以便我们能够在我们的应用程序类型转换再次按要求。

在第二个代码相同的,如果你是在否定然后输入大小与此条件会发生什么

if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
error("Out of memory");


文章来源: Malloc and Void Pointers