第1章 动态内存管理函数:alloc.h 动态内存管理函数在程序执行过程中为程序中的数据分配内存,这些函数都通过指针来指明内存地址。
最常用的动态内存管理函数是stdlib中的malloc()、calloc()和free(),这组函数在同一数据段中分配内存,当程序中动态分配的内存很多,以至于跨跃数据段分配时,用到本章中的函数,其实用性稍差。
本章程序不能用VC编译,所有程序均在TC 2.0中编译运行。 1.1 brk()——重置数据段存储空间函数 brk()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\01
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(每个数之间用一个空格分开)。其具体代码如下:
运行结果如图1.1所示。
图1.1 brk()函数的执行结果(文件中只有8个数) 1.2 coreleft()——获取未使用内存大小函数 coreleft()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\02
coreleft()函数用于获取未使用内存空间大小。
语法
unsigned coreleft(void):
coreleft()函数没有参数。
coreleft()函数的返回值:未使用内存的大小。
示例
本示例演示通过brk()函数改变动态分配空间大小,在改变前后用coreleft()函数输出剩余内存空间。其具体代码如下:
运行结果如图1.2所示。
图1.2 用coreleft()函数查看剩余内存
指点迷津
brk()函数执行前后剩余空间相差996,而不是1000,因为brk(ptr+1000)前4个字节是已用空间。 1.3 farcalloc()——申请远堆空间函数 farcalloc()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\03
farcalloc()函数用于申请远堆空间,每次分配nunits个大小为 unitsz的空间。
语法
void far * farcalloc(unsigned long nunits, unsigned long unitsz);
farcalloc()函数的语法参数说明如下:
参数nunits为分配数据块数。
参数unitsz为每个数据块的字节数。
farcalloc()函数的返回值:成功执行返回分配空间的地址,不成功则返回NULL。
示例
本示例演示用farcalloc()函数分配远堆空间。其具体代码如下:
运行结果如图1.3所示。
图1.3 farcalloc()函数的执行结果 1.4 farcoreleft()——获取远堆空闲存储空间大小函数 farcoreleft()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\04
farcoreleft()函数用于获取远堆中空闲存储空间的大小。
语法
long farcoreleft(void);
farcoreleft()函数没有参数。
farcoreleft()函数的返回值:远堆栈中空闲存储空间大小。
示例
本示例演示用farcalloc()函数两次分配远堆空间,用farcoreleft()函数查看远堆剩余空间。其具体代码如下:
运行结果如图1.4所示。
图1.4 farcoreleft()函数的执行结果 1.5 farfree()——释放远堆空间函数 farfree()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\05
farfree()函数用于释放远堆空间。
语法
void farfree(void);
farfree()函数没有参数。
farfree()函数没有返回值。
示例
本示例演示用farfree()函数释放远堆空间,释放前后用farcoreleft()函数查看剩余空间。其具体代码如下:
运行结果如图1.5所示。
图1.5 farfree()函数的执行结果 1.6 farmalloc()——申请远堆空间函数 farmalloc()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\06
farmalloc()函数用于远堆存储块分配空间。与farcalloc()函数相似,但其功能更简单,farcalloc()一次分配n段大小为size的单元;farmalloc()一次分配1段大小为size的单元。
语法
void far * farmalloc(unsigned long size);
farmalloc()函数的语法参数说明如下:
参数size为分配空间的字节数。
farmalloc()函数的返回值:成功执行返回分配空间的地址,不成功则返回NULL。
示例
本示例演示用farmalloc()函数分配远堆空间。其具体代码如下:
运行结果如图1.6所示。
图1.6 farmalloc()函数的执行结果 1.7 farrealloc()——远堆存储块空间调整函数 farrealloc()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\07
farrealloc()函数用于调整已分配内存的位置,而不改变其空间大小。
语法
void far farrealloc(void far oldblock, unsigned long nbytes);
farrealloc()函数的语法参数说明如下:
参数oldblock为原内存块地址。
参数nbytes为调整量。
farrealloc()函数的返回值:成功执行时返回新地址,失败时则返回NULL。
示例
本示例演示用farrealloc()函数调整内存块位置。调整前后位置有改变,而占用空间大小不变。其具体代码如下:
运行结果如图1.7所示。
图1.7 farrealloc()函数的执行结果 1.8 sbrk()——增加数据段存储空间函数 sbrk()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\01\08
sbrk()函数与brk()函数功能相似,用于改变数据段存储容量。不同的是,sbrk()函数直接说明要增加的容量,而brk()函数通过改变结束位置改变数据段容量。
语法
char *sbrk(int incr);
sbrk()函数的语法参数说明如下:
参数incr为增加字节数。
sbrk()函数的返回值:函数成功执行时返回值为改变前的值,不成功则为-1。
示例
本示例演示用sbrk()函数增加动态内存空间,用coreleft()函数查看增加前后的剩余空间大小。其具体代码如下:
运行结果如图1.8所示。
图1.8 sbrk()函数的执行结果