C语言的动态分配函数

      动态分配函数的核心是malloc()和free()。每次调用malloc()时,均分配剩余的内存的一部分;每次调用free()时,均向系统返还内存。被分配的空内存区中的内存叫做堆(heap)。动态分配函数的原型在中。

      标准C定义了4种动态分配函数,可以用于所有的编译程序。它们是:calloc(),malloc(),free()和realloc()。

      

      (1)calloc

void *calloc(size_t num, size_t size);

      函数calloc()分配的内存量等于num*size,即calloc()为num个大小为size的数组分配足够内存。分配内存中的所有位被初始化为零。

      calloc()返回一个指针,指向分得区域的第一字节。内存不足以满足请求时,返回空指针。因此,使用返回指针前,必须先检查它是否为空指针。

      

//返回指向动态分配的100个浮点数的指针
#include 
#include 

float *get_mem()
{
    float *p;
    p=calloc(100,sizeof(float));
    if(!p){
        printf("Allocation Error\n");
        exit(1);
    }
    return p;
}

      (2)free

void free(void *ptr);
      函数free()向堆中返回ptr指向的内存,使内存可供将来再分配。

      调用free()的指针必须是先前用动态分配系统函数()malloc(),realloc()及calloc())之一所分配而取得的。用无效指针调用free()可能摧毁内存管理机制,使系统瘫痪。

      (3)malloc

void *malloc(size_t size);
      函数malloc()返回一个指针,指向从堆中分配的size字节内存区的首字节。堆中内存不足时,返回空指针。使用前,必须核实返回的指针不为空。否则将导致系统瘫痪。


      (4)realloc

void *realloc(void *ptr, size_t size);
      操作后会分配一个新块,新块包含着与旧块(最大为传入的长度,用size表示)相同的内容。指向新块的指针被返回。新快和旧块可以从同一地址开始。因此realloc()返回的指针可以与传入ptr的指针相同。
      如果ptr是空指针,则realloc()仅分配size字节的内存,并为其返回一个指针。

      如果内存不足,则返回空指针,且原块不变。

#include 
#include 
#include 

int main(void)
{
  char *p;

  //最初通过malloc()函数只分配17个字节
  p = malloc(17);
  if(!p) {
    printf("Allocation Error\n");
    exit(1);
  }

  strcpy(p, "This is 16 chars");

  //通过realloc()函数将原内存扩大到18个字节,多出的一个字节用以存放句点
  p = realloc(p, 18);
  if(!p) {
    printf("Allocation Error\n");
    exit(1);
  }

  strcat(p, ".");

  printf(p);

  free(p);

  return 0;
}

运行结果:
C语言的动态分配函数_第1张图片

你可能感兴趣的:(C)