C语言内存分配:malloc、calloc、realloc

大家都知道程序在内存中的布局分为:栈区、堆、静态变量区、常量区等几个部分。其中堆上的空间分配是由程序员自己来管理的,包括空间的申请和释放。

我们这里就说一下C标准库中提供的几个在堆上操作空间的函数:

1、void*malloc(unsigned size);

2、void*calloc(size_t nelem, size_t elsize);

3、void*realloc(void* ptr, unsigned newsize);


对于malloc(unsigned size)来讲:

它是告诉操作系统要为它分配长度为size的空间。

若分配成功,那么返回指向该块内存的指针;若分配失败,那么返回空指针。程序当中应该对分配是否成功加以控制。

当分配成功时,分配到的这段内存是什么样子的呢?如果这段内存未曾使用过,那么这段内存被初始化为0;如果这段内存曾经使用过,那么这段内存是上一次使用后的结果。因此,此时这段内存中的内容是不确定的,程序当中应该对此加以控制,通常情况下是使用memset()函数显示的将这段内存置为0。


对于calloc(size_t nelen, size_t elsize)来讲:

通过接口不难发现,该函数是告诉操作系统做这样的事:分配nelen个块给我,每个块的大小是elsize。

与malloc()一样,若分配成功,那么返回指向该块内存的指针;若分配失败,那么返回空指针。程序当中应该对分配是否成功加以控制。

与malloc()不同的时,分配到内存都会初始化为0,这点是最大的区别。


对于relloc(void* ptr, unsigned newsize)来讲:

是告诉操作系统分配(可能并不真正分配)newsize一段内存,这段内存的内容是ptr指向的内容。因此可能出现如下两种情况:若ptr指向的内存长度小于newsize,那么重新分配长度newsize的空间,同时拷贝ptr指向的内容到新的空间,新的空间的末尾一段的内容是不确定的(与malloc一样);若ptr指向的内存长度大于newsize,那么不会重新分配空间,但是将原有的空间截断为newsize大小。


最后,无论哪种分配方式,在使用完内存之后都应该使用free()进行释放;同时应该注意指针的编程规范,在定义时或释放完以后都应该即使的置为null,从而避免野指针等问题;在实际的编程当中,更多的使用malloc()和memset()进行内存的分配;calloc()更适合分配数组对应的空间。


你可能感兴趣的:(C语言内存分配:malloc、calloc、realloc)