1.1 brk()--重置数据段存储空间函数
第1章 动态内存管理函数:alloc.h
动态内存管理函数在程序执行过程中为程序中的数据分配内存,这些函数都通过指针来指明内存地址。
最常用的动态内存管理函数是stdlib中的malloc()、calloc()和free(),这组函数在同一数据段中分配内存,当程序中动态分配的内存很多,以至于跨跃数据段分配时,用到本章中的函数,其实用性稍差。
本章程序不能用VC编译,所有程序均在TC 2.0中编译运行。
1.1 brk()--重置数据段存储空间函数
brk()函数
brk()函数用于通过重新设置数据段结束位置,改变数据段存储空间大小。
语法
- int brk(void *endds);
brk()函数的语法参数说明如下:
参数endds为重新设置的数据段结束地址。
brk()函数的返回值:函数成功执行时返回值为0,不成功则为-1。
示例
本示例演示读取文本文件中的所有整数。使用malloc()分配MAX个整数空间,用于保存数据,执行中如果MAX个空间用完而文件中还有未读完的数据,则用brk()函数重新设置数据段存储空间。
程序执行前先在D:\下用记事本建立文件aa.txt,输入1 2 3 4 5 6 7 8(每个数之间用一个空格分开)。其具体代码如下:
- #include "stdio.h"
- #include "alloc.h"
- #define MAX 500 /*预定义空间,也是每次增加的空间容量*/
- main()
- {
- int *p,n=0,max=MAX; /*max实际已分配的空间*/
- FILE *fp;
- clrscr(); /*清屏*/
- fp=fopen("d:\\aa.txt","r"); /*打开文件*/
- p=(int*)malloc(MAX*sizeof(int)); /*预先分配MAX个整数空间*/
- while(!feof(fp)) /*只要没到文件尾就从文件输入*/
- {
- if(n==max) /*空间用完时,增加数据段大小*/
- {
- maxmax=max+MAX;
- brk(p+max); /*将数据段结束位置定在max+MAX,即增加MAX*/
- }
- fscanf(fp,"%d",&p[n]); /*从文件读一个整数*/
- printf("%d ",p[n]); /*显示这个数*/
- n++; /*实际读出数据个数*/
- }
- fclose(fp); /*关闭文件*/
- free(p); /*释放内存*/
- }
1.2 coreleft()--获取未使用内存大小函数
1.2 coreleft()--获取未使用内存大小函数
coreleft()函数
coreleft()函数用于获取未使用内存空间大小。
语法
- unsigned coreleft(void):
coreleft()函数没有参数。
coreleft()函数的返回值:未使用内存的大小。
示例
本示例演示通过brk()函数改变动态分配空间大小,在改变前后用coreleft()函数输出剩余内存空间。其具体代码如下:
- #include "stdio.h"
- #include "alloc.h"
- main()
- {
- char *ptr;
- clrscr(); /*清屏*/
- printf("Chang data segment space allocation with brk()\n");
- ptr=malloc(4); /*分配4个字节,ptr为内存地址数据段起始地址*/
- printf("Before brk() call:%lu bytes free\n",coreleft()); /*coreleft()为未使用内存大小*/
- brk(ptr+1000); /*数据段结束位置设置为prt+1000*/
- printf("After brk() call:%lu bytes free\n",coreleft());
- free(ptr); /*释放内存*/
- }
运行结果如图1.2所示。
1.3 farcalloc()--申请远堆空间函数
1.3 farcalloc()--申请远堆空间函数
farcalloc()函数
farcalloc()函数用于申请远堆空间,每次分配nunits个大小为 unitsz的空间。
语法
- void far * farcalloc(unsigned long nunits,unsigned long unitsz);
farcalloc()函数的语法参数说明如下:
参数nunits为分配数据块数。
参数unitsz为每个数据块的字节数。
farcalloc()函数的返回值:成功执行返回分配空间的地址,不成功则返回NULL。
示例
本示例演示用farcalloc()函数分配远堆空间。其具体代码如下:
- #include<stdio.h>
- #include<alloc.h>
- main()
- {
- int far*fp;
- int x=20;
- clrscr(); /*清屏*/
- fp=farcalloc(0x20000,sizeof(int)); /*为远指针分配内存,fp必须是远指针,因为 0x20000大于64K*/
- *fp=x; /*本程序只用了第1个单元,可以通过循环语句使用 每一存储单元*/
- printf("farcalloc: data is:%d\n",*fp);
- farfree(fp); /*释放内存空间*/
- }
farcoreleft()--获取远堆空闲存储空间大小函数
1.4 farcoreleft()--获取远堆空闲存储空间大小函数
farcoreleft()函数
farcoreleft()函数用于获取远堆中空闲存储空间的大小。
语法
- long farcoreleft(void);
farcoreleft()函数没有参数。
farcoreleft()函数的返回值:远堆栈中空闲存储空间大小。
示例
本示例演示用farcalloc()函数两次分配远堆空间,用farcoreleft()函数查看远堆剩余空间。其具体代码如下:
- #include "alloc.h"
- main()
- {
- char far*fp1,far*fp2;
- clrscr(); /*清屏*/
- fp1=farcalloc(1,sizeof(char)); /*为远指针分配内存*/
- printf("%lu bytes free\n",farcoreleft()); /*获取远堆中空闲存储空间大小*/
- fp2=farmalloc(1000); /*为远指针再分配1000字节内存*/
- printf("%lu bytes free\n",farcoreleft());
- farfree(fp1); /*释放远堆内存空间*/
- }
1.5 farfree()--释放远堆空间函数
1.5 farfree()--释放远堆空间函数
farfree()函数
farfree()函数用于释放远堆空间。
语法
- void farfree(void);
farfree()函数没有参数。
farfree()函数没有返回值。
示例
本示例演示用farfree()函数释放远堆空间,释放前后用farcoreleft()函数查看剩余空间。其具体代码如下:
- #include "alloc.h"
- main()
- {
- char far*fp1,far*fp2;
- clrscr();
- fp1=farcalloc(2000,sizeof(char)); /*为远指针分配内存*/
- printf("%lu bytes free\n",farcoreleft()); /*获取远堆中空闲存储空间大小*/
- farfree(fp1); /*释放远堆内存空间*/
- printf("%lu bytes free\n",farcoreleft()); /*获取远堆中空闲存储空间大小*/
- }
1.6 farmalloc()--申请远堆空间函数
1.6 farmalloc()--申请远堆空间函数
farmalloc()函数
farmalloc()函数用于远堆存储块分配空间。与farcalloc()函数相似,但其功能更简单,farcalloc()一次分配n段大小为size的单元;farmalloc()一次分配1段大小为size的单元。
语法
- void far * farmalloc(unsigned long size);
farmalloc()函数的语法参数说明如下:
参数size为分配空间的字节数。
farmalloc()函数的返回值:成功执行返回分配空间的地址,不成功则返回NULL。
示例
本示例演示用farmalloc()函数分配远堆空间。其具体代码如下:
- #include<stdio.h>
- #include<alloc.h>
- main()
- {
- int far*fp;
- int x=20;
- fp=farmalloc(sizeof(int)); /*为远指针分配内存*/
- *fp=x; /*为分配空间赋值 */
- printf("farmalloc: data is:%d\n",*fp);
- farfree(fp); /*释放内存空间*/
- }
1.7 farrealloc()--远堆存储块空间调整函数
1.7 farrealloc()--远堆存储块空间调整函数
farrealloc()函数
farrealloc()函数用于调整已分配内存的位置,而不改变其空间大小。
语法
- void far *farrealloc(void far *oldblock,unsigned long nbytes);
farrealloc()函数的语法参数说明如下:
参数oldblock为原内存块地址。
参数nbytes为调整量。
farrealloc()函数的返回值:成功执行时返回新地址,失败时则返回NULL。
示例
本示例演示用farrealloc()函数调整内存块位置。调整前后位置有改变,而占用空间大小不变。其具体代码如下:
- #include<stdio.h>
- #include<alloc.h>
- #include <alloc.h>
- main()
- {
- char far*fptr;
- fptr=farmalloc(10); /*动态分配10字节内存*/
- printf("First address:%Fp,freemem:%lu\n",fptr,coreleft()); /*显示它在内存中的位置, 剩余内存*/
- fptr=farrealloc(fptr,20); /*位置增加20字节*/
- printf("New address:%Fp,freemem:%lu\n",fptr,coreleft()); /*显示它在内存中的新位置, 剩余内存*/
- farfree(fptr); /*释放内存*/
- }
1.8 sbrk()--增加数据段存储空间函数
1.8 sbrk()--增加数据段存储空间函数
sbrk()函数
sbrk()函数与brk()函数功能相似,用于改变数据段存储容量。不同的是,sbrk()函数直接说明要增加的容量,而brk()函数通过改变结束位置改变数据段容量。
语法
- char *sbrk(int incr);
sbrk()函数的语法参数说明如下:
参数incr为增加字节数。
sbrk()函数的返回值:函数成功执行时返回值为改变前的值,不成功则为-1。
示例
本示例演示用sbrk()函数增加动态内存空间,用coreleft()函数查看增加前后的剩余空间大小。其具体代码如下:
- #include<stdio.h>
- #include<alloc.h>
- main()
- {
- printf("Changing allocation with sbrk()\n");
- printf("Befor sbrk() call:%lu bytes free\n",coreleft()); /*显示剩余空间*/
- sbrk(1000); /*为数据段增加1000字节*/
- printf("After sbrk() call:%lu bytes free\n",coreleft()); /*显示剩余空间*/
- }
转自:http://book.51cto.com/art/201203/326319.htm