C语言的动态分配函数

来源:互联网 发布:淘宝网打不开商品强细 编辑:程序博客网 时间:2024/06/15 13:27

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

      标准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 <stdlib.h>#include <stdio.h>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 <stdlib.h>#include <stdio.h>#include <string.h>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;}

运行结果:

原创粉丝点击