操作系统实验6 动态申请内存

实验6 动态申请内存
【实验目的】
(1)掌握linux中动态申请内存的方法。
(2)了解操作系统对于高级语言程序设计所提供的环境支撑。
【实验原理/实验基础知识】
为了提高内存利用率,用户程序常采用动态请求内存的方式使用内存。Linux提供了3种动态内存分配方式,3种动态内存分配方式下申请内存空间后,可以调整空间大小,使用完毕后需释放申请到的内存空间。
1. 第一种动态内存分配方法
第一种动态内存分配方法作为高级语言的库函数直接提供给用户使用。使用方法如下:
1) 用void *malloc(int size)申请分配指定size个字节的内存空间,返回该区域的首地址。
2) 用void *realloc(void *ptr,int size)扩大或缩小ptr指定内存大小为size个字节,返回该区域的首地址,地址可能与原区域首地址不同。
3) 用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.第二种动态内存分配方法
第二种动态内存分配的方法是逆向栈方式,栈中可以存放任意多个大小不同的存储块,存取方式为后进先出。使用方法如下:
1) 使用obstack_init()初始化一个逆向栈;
2) 使用obstack_blank()在栈中加入新的可用空间;
3) 使用obstack_copy()对该地址空间进行操作;
4) 使用obstack_free()释放栈中空间。
3.第三种动态内存分配方法
第三种内存动态分配方法是半自动式,程序员只需要给出申请空间的大小就可以使用内存空间,使用完之后也不需要释放,而是由系统自动释放。使用方法很简单,只需要使用alloca()完成空间申请,使用完后由系统自动释放。
【实验环境】VMware Workstation、RedHat
【实验步骤】
(1)使用键盘命令以字节为单位显示当前系统中内存使用情况,特别是当前系统中的空闲内存大小。
free
free -b
在这里插入图片描述
(2)编写一个程序申请两块大小为10的内存,分别存放字符串“123456789”和“987654321”,并输出字符串及存放地址。重新调整内存大小为20,再次输出地址。第二次调整内存大小,调整为200000000(申请空间比较大),再次输出地址。
#include<malloc.h>功能:分配bai长度为num_bytes字节的内存块
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
说明:关于该函数的原型,在旧的版本中malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
名称解释:malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main()
{
char str1,str2;
if((str1=(char
)malloc(10))==NULL)
{printf(“not enough memory to allocate buffer.\n”);exit(0);}
if((str2=(char
)malloc(10))==NULL)
{printf(“not enough memory to allocate buffer.\n”);exit(0);}
strcpy(str1,”123456789”);
strcpy(str2,”987654321”);
printf(“String is %s\n Address is %p\n”,str1,str1);
printf(“String is %s\n Address is %p\n”,str2,str2);
free(str1);
free(str2);
return 0;
}
在这里插入图片描述
在这里插入图片描述
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main()
{
char str1,str2;
if((str1=(char
)malloc(10))==NULL)
{printf(“not enough memory to allocate buffer.\n”);exit(0);}
if((str2=(char
)malloc(10))==NULL)
{printf(“not enough memory to allocate buffer.\n”);exit(0);}

strcpy(str1,”123456789”);
strcpy(str2,” 987654321”);

str1=(char*)reallcoate(str1,20000000);
str2=(char*)reallcoate(str2,20000000);

printf(“String is %s\n Address is %p\n”,str1,str2);
printf(“String is %s\n Address is %p\n”,str1,str2);

free(str1);
free(str2);
return 0;
}
在这里插入图片描述
在这里插入图片描述
(3)再次显示系统中的内存使用情况,对比前后系统中的空闲内存大小有无变化。
在这里插入图片描述
【实验报告】
填写《信息技术学院学生上机实验报告》。
【思考题】
(1) 实验内容(2)中前后三次次输出的内存地址有何不同?
(2) 在程序中申请使用了内存后有没有释放?如果不释放申请的内存,会产生什么情况?

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值