Chinaunix首页 | 论坛 | 博客
  • 博客访问: 199650
  • 博文数量: 22
  • 博客积分: 641
  • 博客等级: 上士
  • 技术积分: 756
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-27 00:41
文章分类

全部博文(22)

文章存档

2014年(1)

2013年(1)

2012年(20)

分类: C/C++

2012-10-12 21:35:14

    c语言为动态内存分配提供了malloc,calloc,realloc,free等函数。这些函数提供了根据需求从操作系统中获取、使用和释放内存的机制。
 
程序代码
 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void err_quit(char *);
  5. void prn(char *,char *,int );
  6. int main()
  7. {
  8.   char *c,*d,*e;
  9.   if((c=malloc(10))==NULL)
  10.      {
  11.        err_quit("malloc_failed");
  12.      }
  13.   prn("malloc",c,10);
  14. /*
  15.   malloc()分配没有被初始化处理过的内存块,并返回被分配的内存块的指针。函数原型定义如下:
  16.      void *malloc(size_t size);
  17.   通常必须对malloc()的返回值作检查,但不必强制指针返回的类型转换,因为该指针自动地被正确
  18.   转换成指定的类型。
  19.   malloc()分配的内存块是未被初始化的,因此在使用该内存块之前还要对它进行初始化。概念上是这样的,
  20.   后面运行的结果倒是给初始化为0了,用的gcc编译器。
  21. */
  22.   free(c);
  23. /*
  24.   free()用于内存块的释放,其函数原型定义如下:
  25.     void free(void *ptr)
  26.   其参数必须是先前调用函数malloc()或calloc()返回的指针。内存分配函数从堆内存池分配内存空间。
  27.   内存是一个有限的资源,则用了要释放它。永远不释放的话,会引起内存泄露。
  28. */
  29.   if((d=calloc(10,1))==NULL)
  30.      {
  31.        err_quit("calloc_failed");
  32.      }
  33.   prn("calloc",d,10);
  34. /*
  35.   函数calloc()分配并初始化处理过的内存块,其函数原型定义如下:
  36.      void *calloc(size_t nmemb,size_t size)
  37.   该函数与mallc()非常相似,都是返回被分配的大小为nmemb*size字节的内存块的指针,不同之处在于
  38.   calloc()要初始化被分配的内存块,即把每个位置写0.
  39. */
  40.   strcpy(d,"hello world");
  41.   fprintf(stdout,"d=%s\n",d);
  42.   if((c=realloc(d,20))==NULL)
  43.      {
  44.        err_quit("realloc_failed");
  45.      }
  46.   fprintf(stdout,"d=%s\n",d);
  47.   prn("realloc",d,20);
  48. /*
  49.   函数用于realloc()用于调整先前调用malloc()或者calloc()分配过的内存块大小。该函数原型如下:
  50.     void *realloc(void *ptr,size_t size)
  51.   其参数ptr必须是先前调用函数malloc或calloc返回的指针,参数size可以大于原来分配的内存块大小,
  52.   也可以小于它。增加或减少内存块一般是在原来的内存空间中进行。如果在原来的内存空间中不可能,
  53.   那么函数realloc()会把原来的数据拷入新的内存块中,因此编程者一定要调整指针以便正确地访问新的
  54.   内存块。它有一下特性
  55.   1.不对增加的内存块进行初始化
  56.   2.如果不能加大内存块则返回NULL,而原有的数据则不能再被访问
  57.   3.如果第一个参数为NULL,那么它的作用和函数malloc()一样
  58.   4.如果第二个参数为0,那么内存块被释放
  59. */
  60.   if((e=alloca(10))==NULL)
  61.     {
  62.       err_quit("alloca_failed");
  63.     }
  64.   prn("alloca",e,10);
  65. /*
  66. 函数alloc()的作用是分配未被初始化的内存块,其函数原型如下:
  67. void *alloca(size_t size)
  68. 之前的malloc(),calloc(),realloc()都是从堆中分配内存
  69. 而alloca()却是从进程的堆栈中分配内存,当调用alloca()的函数返回时,
  70. 它所分配的内存空间会被自动释放
  71. */
  72.   exit(0);
  73. }
  74. void err_quit(char *msg)
  75. {
  76.  fprintf(stderr,"%s\n",msg);
  77.  exit(EXIT_FAILURE);
  78. }
  79. void prn(char *memop,char *str,int len)
  80. {
  81.  int i;
  82.  fprintf(stdout,"%8s\n",memop);
  83.  puts(str);
  84.  fprintf(stdout,"\n");
  85. }

运行结果
 

malloc

calloc

d=foobar
foobar
d=foobar
realloc
foobar
alloca
▒▒▒︢▒P▒


阅读(2566) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~