现在的位置: 首页 > 综合 > 正文

深入详解标准c内存函数

2014年01月15日 ⁄ 综合 ⁄ 共 2529字 ⁄ 字号 评论关闭

                               标准c内存函数

函数列表:
calloc() 分配一个二维储存空间
free() 释放已分配空间
malloc() 分配空间
realloc() 改变已分配空间的大小
 
/////////////////////////////////////////////////////////////////////////////////////

#include <stdlib.h>
void *calloc( size_t num, size_t size );
功能: 函数返回一个指针,指向分配了num个元素的数组的首地址,数组的每个元素所占的字节大小为size。如果错误发生返回NULL。
示例:
#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 );
}
输出结果:
Allocated 40 long integers

#include <stdlib.h>
void free( void *ptr );
功能: 函数释放指针ptr指向的空间,以供以后使用。指针ptr 必须由先前对malloc(), calloc(), realloc()的调用返回。
void *malloc( size_t size );
功能: 函数指向一个大小为size的空间,如果错误发生返回NULL。 存储空间的指针必须为堆,不能是栈。这样以便以后用free函数释放空间。例如:

    typedef struct data_type {
      int age;
      char name[20];
    } data;
   
    data *bob;
    bob = (data*) malloc( sizeof(data) );
    if( bob != NULL ) {
      bob->age = 22;
      strcpy( bob->name, "Robert" );
      printf( "%s is %d years old/n", bob->name, bob->age );
    }
    free( bob );
void *realloc( void *mem_address, size_t size );
功能: 函数将mem_address 对象的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。

1.realloc是从堆上分配内存的,当扩大一块内存空间时,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize,结果得到的是一块连续的内存。
2.如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存,并把原来大小内存空间中的内容复制到newsize中,然后返回新的mem_address指针。(数据被移动了)
3.如果mem_address为null,则realloc()和malloc()类似,分配一个newsize的内存块,返回一个指向该内存块的指针;如果newsize大小为0,那么释放mem_address指向的内存,并返回null;如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回null,而原来的内存块保持不变。

示例:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main( void )
{
   long *buffer;
   size_t size;
   if( (buffer = (long *)malloc( 10 * sizeof( long ) )) == NULL )
      exit( 1 );
   size = _msize( buffer );//求内存块大小size_t _msize( void *memblock );
   printf( "Size of block after malloc of 10 longs: %u/n", size );
   /* Reallocate and show new size: */
   if( (buffer = (long*)realloc( buffer, size + (10 * sizeof( long )) ))
        ==  NULL )
      exit( 1 );
   size = _msize( buffer );
   printf( "Size of block after realloc of 10 more longs: %u/n",
            size );
   free( buffer );
   exit( 0 );
}
输出结果:
Size of block after malloc of 10 longs: 40
Size of block after realloc of 10 more longs: 80

下面谈谈malloc()与calloc的区别。
1.malloc()函数有一个参数,即要分配的内存空间的大小。
2.calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。
3.前者不能初始化所分配的内存空间,而后者能。malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
4.calloc()会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针。

最后讲一下new运算的特点。
new 返回指定类型的指针,并且可以自动计算所需要内存大小,而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。
示例:int *parr = new int [100]; //返回类型为 int* 类型,分配大小为 sizeof(int) * 100.

抱歉!评论已关闭.