您的位置:首页 > 其它

malloc ? realloc ? free ? calloc ?

2012-05-07 22:47 344 查看
malloc 函数:void *malloc(size_t size);

1. malloc—— 向系统申请分配指定size个字节的内存空间。返回类型是void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

2. malloc 函数实现机制 :

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。(本段内容
来源于:百度百科)

具体事例:

#include <stdio.h>
#include <malloc.h>
#define _MAX_PATH 10

void main( void )
{
   char * string;

   /* Allocate space for a path name */
   string = malloc( _MAX_PATH );
   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );
      printf( "Memory freed\n" );
   }
}
Output

Memory space allocated for path name
Memory freed


realloc 函数:void *realloc( void *memblock, size_t size );

语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小不然的话会导致数据丢失!

realloc 使用总结:

1.
realloc失败的时候,返回NULL

 2. realloc失败的时候,原来的内存不改变,不会释放也不会移动

  3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址

  4. 如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针**a,对a调用realloc时只会释放一维,使用时谨防内存泄露。

  5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的

  6.传递给realloc的指针可以为空,等同于malloc。

具体事例:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <crtdbg.h>

void main( void )
{
   long *buffer;
   size_t size;

   if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
      exit( 1 );

   size = _msize( buffer );
   printf( "Size of block after malloc of 1000 longs: %u\n", size );

   /* Reallocate and show new size: */
   if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
        ==  NULL )
      exit( 1 );
   size = _msize( buffer );
   printf( "Size of block after realloc of 1000 more longs: %u\n",
            size );

   free( buffer );
   exit( 0 );
}
Output

Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000


这是 数据结构课中的一个算法:

Status ListInsert_Sq(SqList &L,int i,int e) 
{
	int *newbase;
    int *p,*q;
	if(i<1 || i>L.length+1) return ERROR; 

    if(L.length>=L.listsize){
	  newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)* sizeof(int));
	  if(!newbase) exit(OVERFLOW); 

	L.elem=newbase; 
    L.listsize+=LISTINCREMENT; } 
    q=&(L.elem[i-1]); 
    for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;
    *q=e; ++L.length;
	return OK;
}


calloc :void *calloc(unsigned n,unsigned size);

 功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

跟malloc的区别:

  calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

实例:

/* CALLOC.C: This program uses calloc to allocate space for
 * 40 long integers. It initializes each element to zero.
 */
#include <stdio.h>
#include <malloc.h>

void main( void )
{
   long *buffer;

   buffer = (long *)calloc( 40, sizeof( long ) );
   if( buffer != NULL )
      printf( "Allocated 40 long integers\n" );
   else
      printf( "Can't allocate memory\n" );
   free( buffer );
}
/*
Output
Allocated 40 long integers*/


free :

原型: void free(void *ptr)

 功 能: 释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。

具体实例:

/* MALLOC.C: This program allocates memory with
 * malloc, then frees the memory with free.
 */

#include <stdlib.h>         /* For _MAX_PATH definition */
#include <stdio.h>
#include <malloc.h>
#define _MAX_PATH 4

void main( void )
{
   char *string;

   /* Allocate space for a path name */
   string = malloc( _MAX_PATH );
   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );
      printf( "Memory freed\n" );
   }
}

/*
Output

Memory space allocated for path name
Memory freed*/


先就这样吧,数据结构中要用到,而在C语言里,我没好好学这个,补上! 哈哈!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: