malloc、calloc、realloc函数的使用与区别

malloc

  • 函数声明:void *malloc(size_t size); 参数size为申请空间的长度
  • 函数功能:malloc()在内存的动态存储区中分配一块长度为size字节的连续区域,申请成功则返回该区域的首地址。

        注意:1.空间首地址(默认void*)是否需要进行类型转换。

                    2.调用后需要判断是否申请成功。若返回值为NULL则申请失败。

 

calloc

  • 函数声明:void *calloc(size_t num, size_t size); 参数num为元素个数,参数size为申请空间的单位元素长度,。
  • 函数功能:与malloc()类似,在内存的动态存储区中分配n块长度为“size”字节的连续区域,并将所分配的空间中的每一位都初始化为0。申请成功则返回该区域的首地址。

 

realloc

  • 函数声明:void *realloc( void *ptr, size_t size ); 参数ptr为原有的空间地址,newsize是重新申请的地址长度 
  • 函数功能:realloc()是给一个已经分配了地址的指针重新分配空间。

free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。 

区别:

 相同点:都在stdlib.h函数库内,它们申请的空间都在堆上且使用完后都要通过free释放空间。

                 返回值都是请求系统分配的地址,如果请求失败就返回NULL。

不同点:

                 malloc不能初始化所分配的内存空间(需要使用memset来初始化),如果这部分内存曾经被分配过,则其中可能遗留各种各样的数据。

                 calloc会将所分配的空间中的每一位都初始化为零。

                 realloc可以对给定的指针所指向的空间进行扩大或缩小,原有的内存中的内容将保持不变。realloc并不保证调整后的内存空间和原来的内存空间是同一内存地址。因为当扩大一块内存空间时,realloc试图直接从现存的数据后面的字节中获得附加的字节,如果能够满足需求,就直接返回原用户空间地址;如果后面的字节不够,那么就使用堆上的一个足够满足要求的自由空间块,现存的数据就会被拷贝到新的位置上,而老块则放回堆空间,也就是说数据可能被移动。所以返回的指针很可能指向新的地址。

 

补充:

        malloc、calloc函数的实质体现在将一块可用的内存连接为一个链表。调用malloc函数时,它沿链表寻找一个满足用户请求所需要大小的内存块,然后将该内存块一分为二(一块与用户申请的大小一样,另一块就是剩下的字节)。接下来,将分配给用户的那块内存地址传给用户,调用free函数时,它将用户释放的内存块连接到空链上,最后空闲链表会被切成很多的小内存片段。

你可能感兴趣的:(C#)