动态内存管理函数:alloc.ha


1.1 brk()--重置数据段存储空间函数

第1章 动态内存管理函数:alloc.h

动态内存管理函数在程序执行过程中为程序中的数据分配内存,这些函数都通过指针来指明内存地址。

最常用的动态内存管理函数是stdlib中的malloc()、calloc()和free(),这组函数在同一数据段中分配内存,当程序中动态分配的内存很多,以至于跨跃数据段分配时,用到本章中的函数,其实用性稍差。

本章程序不能用VC编译,所有程序均在TC 2.0中编译运行。

1.1  brk()--重置数据段存储空间函数

brk()函数

brk()函数用于通过重新设置数据段结束位置,改变数据段存储空间大小。

语法

 
 
  1. int brk(void *endds); 

brk()函数的语法参数说明如下:

参数endds为重新设置的数据段结束地址。

brk()函数的返回值:函数成功执行时返回值为0,不成功则为-1。

示例

本示例演示读取文本文件中的所有整数。使用malloc()分配MAX个整数空间,用于保存数据,执行中如果MAX个空间用完而文件中还有未读完的数据,则用brk()函数重新设置数据段存储空间。

程序执行前先在D:\下用记事本建立文件aa.txt,输入1 2 3 4 5 6 7 8(每个数之间用一个空格分开)。其具体代码如下:

 
 
  1. #include "stdio.h"  
  2. #include "alloc.h"  
  3. #define MAX 500                 /*预定义空间,也是每次增加的空间容量*/  
  4. main()  
  5. {  
  6.     int *p,n=0,max=MAX;         /*max实际已分配的空间*/  
  7.     FILE *fp;  
  8.     clrscr();                       /*清屏*/  
  9.     fp=fopen("d:\\aa.txt","r");     /*打开文件*/  
  10.     p=(int*)malloc(MAX*sizeof(int));    /*预先分配MAX个整数空间*/  
  11.     while(!feof(fp))                /*只要没到文件尾就从文件输入*/  
  12.     {  
  13.         if(n==max)              /*空间用完时,增加数据段大小*/  
  14.         {  
  15.             maxmax=max+MAX;  
  16.             brk(p+max);         /*将数据段结束位置定在max+MAX,即增加MAX*/  
  17.         }  
  18.         fscanf(fp,"%d",&p[n]);      /*从文件读一个整数*/  
  19.         printf("%d ",p[n]);         /*显示这个数*/  
  20.         n++;                    /*实际读出数据个数*/  
  21.     }  
  22.     fclose(fp);                 /*关闭文件*/  
  23.     free(p);                        /*释放内存*/  

1.2 coreleft()--获取未使用内存大小函数

1.2  coreleft()--获取未使用内存大小函数

coreleft()函数

coreleft()函数用于获取未使用内存空间大小。

语法

 
 
  1. unsigned coreleft(void): 

coreleft()函数没有参数。

coreleft()函数的返回值:未使用内存的大小。

示例

本示例演示通过brk()函数改变动态分配空间大小,在改变前后用coreleft()函数输出剩余内存空间。其具体代码如下:

 
 
  1. #include "stdio.h"  
  2. #include "alloc.h"  
  3. main()  
  4. {  
  5.     char *ptr;  
  6.     clrscr();                           /*清屏*/  
  7.     printf("Chang data segment space allocation with brk()\n");  
  8.     ptr=malloc(4);                  /*分配4个字节,ptr为内存地址数据段起始地址*/  
  9.     printf("Before brk() call:%lu bytes free\n",coreleft());        /*coreleft()为未使用内存大小*/  
  10.     brk(ptr+1000);                  /*数据段结束位置设置为prt+1000*/  
  11.     printf("After  brk() call:%lu bytes free\n",coreleft());  
  12.     free(ptr);                                  /*释放内存*/  

运行结果如图1.2所示。

1.3 farcalloc()--申请远堆空间函数

1.3  farcalloc()--申请远堆空间函数

farcalloc()函数

farcalloc()函数用于申请远堆空间,每次分配nunits个大小为 unitsz的空间。

语法

 
 
  1. void far * farcalloc(unsigned long nunits,unsigned long unitsz); 

farcalloc()函数的语法参数说明如下:

参数nunits为分配数据块数。

参数unitsz为每个数据块的字节数。

farcalloc()函数的返回值:成功执行返回分配空间的地址,不成功则返回NULL。

示例

本示例演示用farcalloc()函数分配远堆空间。其具体代码如下:

 
 
  1. #include<stdio.h> 
  2. #include<alloc.h> 
  3. main()  
  4. {  
  5.     int far*fp;  
  6.     int x=20;  
  7.     clrscr();                           /*清屏*/  
  8.     fp=farcalloc(0x20000,sizeof(int));      /*为远指针分配内存,fp必须是远指针,因为                                            0x20000大于64K*/  
  9.     *fp=x;                          /*本程序只用了第1个单元,可以通过循环语句使用                                          每一存储单元*/  
  10.     printf("farcalloc: data is:%d\n",*fp);  
  11.     farfree(fp);                        /*释放内存空间*/  

farcoreleft()--获取远堆空闲存储空间大小函数

1.4  farcoreleft()--获取远堆空闲存储空间大小函数

farcoreleft()函数

farcoreleft()函数用于获取远堆中空闲存储空间的大小。

语法

 
 
  1. long farcoreleft(void); 

farcoreleft()函数没有参数。

farcoreleft()函数的返回值:远堆栈中空闲存储空间大小。

示例

本示例演示用farcalloc()函数两次分配远堆空间,用farcoreleft()函数查看远堆剩余空间。其具体代码如下:

 
 
  1. #include "alloc.h"  
  2. main()  
  3. {  
  4.     char far*fp1,far*fp2;  
  5.     clrscr();                                   /*清屏*/  
  6.     fp1=farcalloc(1,sizeof(char));                  /*为远指针分配内存*/  
  7.     printf("%lu bytes free\n",farcoreleft());           /*获取远堆中空闲存储空间大小*/  
  8.     fp2=farmalloc(1000);                        /*为远指针再分配1000字节内存*/  
  9.     printf("%lu bytes free\n",farcoreleft());  
  10.     farfree(fp1);                               /*释放远堆内存空间*/  
  11. }

1.5 farfree()--释放远堆空间函数

1.5  farfree()--释放远堆空间函数

farfree()函数

farfree()函数用于释放远堆空间。

语法

 
 
  1. void farfree(void); 

farfree()函数没有参数。

farfree()函数没有返回值。

示例

本示例演示用farfree()函数释放远堆空间,释放前后用farcoreleft()函数查看剩余空间。其具体代码如下:

 
 
  1. #include "alloc.h"  
  2. main()  
  3. {  
  4.     char far*fp1,far*fp2;  
  5.     clrscr();  
  6.     fp1=farcalloc(2000,sizeof(char));               /*为远指针分配内存*/  
  7.     printf("%lu bytes free\n",farcoreleft());           /*获取远堆中空闲存储空间大小*/  
  8.     farfree(fp1);                               /*释放远堆内存空间*/  
  9.     printf("%lu bytes free\n",farcoreleft());           /*获取远堆中空闲存储空间大小*/  

1.6 farmalloc()--申请远堆空间函数

1.6  farmalloc()--申请远堆空间函数

farmalloc()函数

farmalloc()函数用于远堆存储块分配空间。与farcalloc()函数相似,但其功能更简单,farcalloc()一次分配n段大小为size的单元;farmalloc()一次分配1段大小为size的单元。

语法

 
 
  1. void far * farmalloc(unsigned long size); 

farmalloc()函数的语法参数说明如下:

参数size为分配空间的字节数。

farmalloc()函数的返回值:成功执行返回分配空间的地址,不成功则返回NULL。

示例

本示例演示用farmalloc()函数分配远堆空间。其具体代码如下:

 
 
  1. #include<stdio.h> 
  2. #include<alloc.h> 
  3. main()  
  4. {  
  5.     int far*fp;  
  6.     int x=20;  
  7.     fp=farmalloc(sizeof(int));                      /*为远指针分配内存*/  
  8.     *fp=x;                                  /*为分配空间赋值 */  
  9.     printf("farmalloc: data is:%d\n",*fp);  
  10.     farfree(fp);                                /*释放内存空间*/  

1.7 farrealloc()--远堆存储块空间调整函数

1.7  farrealloc()--远堆存储块空间调整函数

farrealloc()函数

farrealloc()函数用于调整已分配内存的位置,而不改变其空间大小。

语法

 
 
  1. void far *farrealloc(void far *oldblock,unsigned long nbytes); 

farrealloc()函数的语法参数说明如下:

参数oldblock为原内存块地址。

参数nbytes为调整量。

farrealloc()函数的返回值:成功执行时返回新地址,失败时则返回NULL。

示例

本示例演示用farrealloc()函数调整内存块位置。调整前后位置有改变,而占用空间大小不变。其具体代码如下:

 
 
  1. #include<stdio.h> 
  2. #include<alloc.h> 
  3. #include <alloc.h> 
  4. main()  
  5. {  
  6.     char far*fptr;  
  7.     fptr=farmalloc(10);                                 /*动态分配10字节内存*/  
  8.     printf("First address:%Fp,freemem:%lu\n",fptr,coreleft());      /*显示它在内存中的位置,                                                         剩余内存*/  
  9.     fptr=farrealloc(fptr,20);                               /*位置增加20字节*/  
  10.     printf("New   address:%Fp,freemem:%lu\n",fptr,coreleft());  /*显示它在内存中的新位置,                                                        剩余内存*/  
  11.     farfree(fptr);                                      /*释放内存*/  

1.8 sbrk()--增加数据段存储空间函数

1.8  sbrk()--增加数据段存储空间函数

sbrk()函数

sbrk()函数与brk()函数功能相似,用于改变数据段存储容量。不同的是,sbrk()函数直接说明要增加的容量,而brk()函数通过改变结束位置改变数据段容量。

语法

 
 
  1. char *sbrk(int incr); 

sbrk()函数的语法参数说明如下:

参数incr为增加字节数。

sbrk()函数的返回值:函数成功执行时返回值为改变前的值,不成功则为-1。

示例

本示例演示用sbrk()函数增加动态内存空间,用coreleft()函数查看增加前后的剩余空间大小。其具体代码如下:

 
 
  1. #include<stdio.h> 
  2. #include<alloc.h> 
  3. main()  
  4. {  
  5.     printf("Changing allocation with sbrk()\n");  
  6.     printf("Befor sbrk() call:%lu bytes free\n",coreleft());        /*显示剩余空间*/  
  7.     sbrk(1000);                                 /*为数据段增加1000字节*/  
  8.     printf("After sbrk() call:%lu bytes free\n",coreleft());        /*显示剩余空间*/  


转自:http://book.51cto.com/art/201203/326319.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值