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

更新时间:2024-04-15 10:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

广州大学学生实验报告

开课学院及实验室:计算机科学与工程实验室 学院 计算机科学与教育软件学院 2014年11月19日 姓名 学号 年级/专业/班 实验课程名称 实验项目名称

操作系统实验 Linux下的内存分配与回收的管理 成绩 指导老师 张艳玲 一、实验目的

在Linux环境下利用下列系统调用malloc(), free()编写一段程序实现内存分配与回收的管理。 二、实验器材

1、计算机一台。 2、Linux

三、实验内容

1. 返回已分配给变量的内存地址; 2. 返回释放后的内存地址;

3. 释放已分配的内存空间后,返回释放内存后未使用内存的大小。

四、实验步骤、记录和结果

源代码有错,不能正常运行,使用纯C语言,修改正如下。

黄色底色的为新增代码 新增注释为绿色底色

#include /* For _MAX_PATH definition */ #include //#include //#include #include //void main() int main() {

// int *string; char *string;

// string =(int*) malloc(10 );

string = (char*) malloc(sizeof(char)*10); if( string == NULL )

printf( \ else {

printf( \ /*printf (\// cout<<\ free( string );

printf( \ }

//int *stringy;

char *stringy;

//stringy =(int*) malloc(12 );

stringy =(char*) malloc(sizeof(char)*12 ); if( stringy == NULL )

printf( \ else {

printf( \ /*printf (\// cout<<\ free( stringy );

printf( \ }

return 0; }

编译运行结果如下图所示:

现在再修改下代码,输出两个变量的内存地址

#include #include int main(){

char *string = (char*) malloc(sizeof(char)*10);

if( string == NULL )

printf( \ else{

printf( \

printf(\ //输出string的内存地址 free(string);

printf( \

printf(\ //输出string释放后的内存地址 }

char *string_y = (char*) malloc(sizeof(char)*12 ); if( string_y == NULL )

printf( \ else{

printf( \

printf(\ //输出string_y的内存地址 free( string_y );

printf( \

printf(\ //输出string_y释放后的内存地址 }

return 0; }

再次运行,结果如下,可见他们的地址相同,这是因为string分配了内存空间后,释放了,被系统回收,所以string_y申请到的地址是前一个,也就是string的地址。

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

再修改代码,将内存释放free放到程序结束前,即

free(string);

printf( \ free( string_y );

printf( \

return 0;

运行结果如下:

按理说string地址为10010 3630 ,占10字节,那么string_y地址应该是10010 363A才对,

原来这里跟内存地址对齐有关,由下图可见,当前系统默认是以8字节对齐,由于string占10字节,大于8却不足16,所以剩余的6字节被填充了。因此才会出现上面的结果。

再次修改代码,如下

#include #include #include int main(){

char *string = (char*) malloc(sizeof(char)*10);

if( string == NULL )

printf( \ else{

printf( \

strcpy(string, \ //复制文本到string

unsigned long unused = 10 - strlen(string); //获取未使用长度

free(string);

printf( \

printf(\ //输出未使用长度 }

return 0; }

运行结果如下:

可见还有4字节空间未使用。

心得体会

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

本文来源:https://www.bwwdw.com/article/i6qp.html

Top