第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(每个数之间用一个空格分开)。其具体代码如下:

    img12

    img13

    运行结果如图1.1所示。

    img14

    图1.1 brk()函数的执行结果(文件中只有8个数) 1.2 coreleft()——获取未使用内存大小函数 coreleft()函数

    实用程度:★★☆☆☆

    实例位置:配套资源\SL\01\02

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

    语法

    unsigned coreleft(void):

    coreleft()函数没有参数。

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

    示例

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

    img15

    运行结果如图1.2所示。

    img16

    图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()函数分配远堆空间。其具体代码如下:

    img17

    运行结果如图1.3所示。

    img18

    图1.3 farcalloc()函数的执行结果 1.4 farcoreleft()——获取远堆空闲存储空间大小函数 farcoreleft()函数

    实用程度:★★☆☆☆

    实例位置:配套资源\SL\01\04

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

    语法

    long farcoreleft(void);

    farcoreleft()函数没有参数。

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

    示例

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

    img19

    运行结果如图1.4所示。

    img20

    图1.4 farcoreleft()函数的执行结果 1.5 farfree()——释放远堆空间函数 farfree()函数

    实用程度:★★☆☆☆

    实例位置:配套资源\SL\01\05

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

    语法

    void farfree(void);

    farfree()函数没有参数。

    farfree()函数没有返回值。

    示例

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

    img21

    运行结果如图1.5所示。

    img22

    图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()函数分配远堆空间。其具体代码如下:

    img23

    运行结果如图1.6所示。

    img24

    图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()函数调整内存块位置。调整前后位置有改变,而占用空间大小不变。其具体代码如下:

    img25

    运行结果如图1.7所示。

    img26

    图1.7 farrealloc()函数的执行结果 1.8 sbrk()——增加数据段存储空间函数 sbrk()函数

    实用程度:★★☆☆☆

    实例位置:配套资源\SL\01\08

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

    语法

    char *sbrk(int incr);

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

    参数incr为增加字节数。

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

    示例

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

    img27

    运行结果如图1.8所示。

    img28

    图1.8 sbrk()函数的执行结果