当前位置:文档之家› 操作系统原理-Linux下的内存分配与回收的管理

操作系统原理-Linux下的内存分配与回收的管理

广州大学学生实验报告
一、实验目的
在Linux环境下利用下列系统调用malloc(),free()编写一段程序实现内存分配与回收的管理。

二、实验器材
1、计算机一台。

2、Linux
三、实验内容
1.返回已分配给变量的内存地址;
2.返回释放后的内存地址;
3.释放已分配的内存空间后,返回释放内存后未使用内存的大小。

四、实验步骤、记录和结果
源代码有错,不能正常运行,使用纯C语言,修改正如下。

黄色底色的为新增代码新增注释为绿色底色
#include <stdlib.h> /* For _MAX_PATH definition */
#include <stdio.h>
//#include <malloc.h>
//#include <iostream.h>
#include <string.h>
//void main()
int main()
{
// int *string;
char *string;
// string =(int*) malloc(10 );
string = (char*) malloc(sizeof(char)*10);
if( string == NULL )
printf( "Insufficient memory available\n" );
else
{
printf( "Memory space allocated for path name\n" );
/*printf ("string=%d\n",string);*/
// cout<<"string="<<string<<endl;
free( string );
printf( "Memory freed\n" );
}
//int *stringy;
char *stringy;
//stringy =(int*) malloc(12 );
stringy =(char*) malloc(sizeof(char)*12 );
if( stringy == NULL )
printf( "Insufficient memory available\n" );
else
{
printf( "Memory space allocated for path name\n" );
/*printf ("string=%d\n",string);*/
// cout<<"stringy="<<stringy<<endl;
free( stringy );
printf( "Memory freed\n" );
}
return 0;
}
编译运行结果如下图所示:
现在再修改下代码,输出两个变量的内存地址
#include <stdlib.h>
#include <stdio.h>
int main(){
char *string = (char*) malloc(sizeof(char)*10);
if( string == NULL )
printf( "string Insufficient memory available\n" );
else{
printf( "string Memory space allocated for path name\n" );
printf("string's address:%p\n",string); //输出string的内存地址
free(string);
printf( "string Memory freed\n" );
printf("after freed address:%p\n",string); //输出string释放后的内存地址}
char *string_y = (char*) malloc(sizeof(char)*12 );
if( string_y == NULL )
printf( "string_y Insufficient memory available\n" );
else{
printf( "string_y Memory space allocated for path name\n" );
printf("string_y's address:%p\n",string_y); //输出string_y的内存地址
free( string_y );
printf( "string_y Memory freed\n" );
printf("after freed address:%p\n",string_y); //输出string_y释放后的内存地址}
return 0;
}
再次运行,结果如下,可见他们的地址相同,这是因为string分配了内存空间后,释放了,被系统回收,所以string_y申请到的地址是前一个,也就是string的地址。

而执行free之后,地址依然不变是因为内存释放了,但是并没有将其设置为NULL。

再修改代码,将内存释放free放到程序结束前,即
free(string);
printf( "string Memory freed\n" );
free( string_y );
printf( "string_y Memory freed\n" );
return 0;
运行结果如下:
按理说string地址为10010 3630 ,占10字节,那么string_y地址应该是10010 363A才对,
原来这里跟内存地址对齐有关,由下图可见,当前系统默认是以8字节对齐,由于string占10字节,大于8却不足16,所以剩余的6字节被填充了。

因此才会出现上面的结果。

再次修改代码,如下
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
char *string = (char*) malloc(sizeof(char)*10);
if( string == NULL )
printf( "string Insufficient memory available\n" );
else{
printf( "string Memory space allocated for path name\n" );
strcpy(string, "hello!"); //复制文本到string
unsigned long unused = 10 - strlen(string); //获取未使用长度
free(string);
printf( "string Memory freed\n" );
printf("unused:%lu\n",unused); //输出未使用长度}
return 0;
}
运行结果如下:
可见还有4字节空间未使用。

心得体会
本实验虽然相对上一个实验提供的代码短很多,但是所涉及的知识覆盖面较广,在做实验的过程中也学到了不少知识。

相关主题