实验6 动态申请内存
【实验目的】
(1)掌握linux中动态申请内存的方法。
(2)了解操作系统对于高级语言程序设计所提供的环境支撑。
【实验原理/实验基础知识】
为了提高内存利用率,用户程序常采用动态请求内存的方式使用内存。Linux提供了3种动态内存分配方式,3种动态内存分配方式下申请内存空间后,可以调整空间大小,使用完毕后需释放申请到的内存空间。
- 第一种动态内存分配方法
第一种动态内存分配方法作为高级语言的库函数直接提供给用户使用。使用方法如下:
- 用void *malloc(int size)申请分配指定size个字节的内存空间,返回该区域的首地址。
- 用void *realloc(void *ptr,int size)扩大或缩小ptr指定内存大小为size个字节,返回该区域的首地址,地址可能与原区域首地址不同。
- 用free(void *ptr)释放ptr指定的内存区域。
[例]:申请、使用、释放内存。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
Int main(void)
{
Char *str;
If((str=(char*)malloc(10))==null)
{
Printf(“Not enough memory to allocate buffer\n”);
Exit(1);
}
Strcpy(str,”hello”);
Printf(“string is %s\n”,str);
Free(str);
Return 0;
}
[例]:修改申请内存大小。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
Int main(void)
{
Char *str;
If((str=(char*)malloc(10))==null)
{
Printf(“Not enough memory to allocate buffer\n”);
Exit(1);
}
Strcpy(str,”hello”);
str=(char*)realloc (str,20)) //realloc内的str表示原来申请的空间,赋值后更改空间大小。
//。。。此处省略其他代码内容。
}
2.第二种动态内存分配方法
第二种动态内存分配的方法是逆向栈方式,栈中可以存放任意多个大小不同的存储块,存取方式为后进先出。使用方法如下:
-
- 使用obstack_init()初始化一个逆向栈;
- 使用obstack_blank()在栈中加入新的可用空间;
- 使用obstack_copy()对该地址空间进行操作;
- 使用obstack_free()释放栈中空间。
3.第三种动态内存分配方法
第三种内存动态分配方法是半自动式,程序员只需要给出申请空间的大小就可以使用内存空间,使用完之后也不需要释放,而是由系统自动释放。使用方法很简单,只需要使用alloca()完成空间申请,使用完后由系统自动释放。
【实验环境】VMware Workstation、RedHat
【实验步骤】
(1)使用键盘命令以字节为单位显示当前系统中内存使用情况,特别是当前系统中的空闲内存大小。
(2)编写一个程序申请两块大小为10的内存,分别存放字符串“123456789”和“987654321”,并输出字符串及存放地址。重新调整内存大小为20,再次输出地址。第二次调整内存大小,调整为200000000(申请空间比较大),再次输出地址。
(3)重新调整内存大小为20,再次输出地址。
(4)第二次调整内存大小,调整为200000000(申请空间比较大),再次输出地址。
(5)再次显示系统中的内存使用情况,对比前后系统中的空闲内存大小有无变化。
【实验报告】
填写《信息技术学院学生上机实验报告》。
【思考题】
- 实验内容(2)中前后三次次输出的内存地址有何不同?
答:输出的内存地址会随所申请的内存空间的大小变化而变化。
2. 在程序中申请使用了内存后有没有释放?如果不释放申请的内存,会产生什么情况?
答:当程序运行过程中malloc了,但是没有free的话,会造成内存泄漏;一部分的内存没有被使用,但是由于没有free,因此系统认为这部分内存还在使用,造成不断的向系统申请内存,使得系统可用内存不断减少。