******同组同学学号:同组同学姓名:实验日期:交报告日期:实验(No.4)题目:编程与调试:内存管理实验目的及要求:实验目的:操作系统的发展使得系统完成了大部分的内存管理工作,对于程序员而言,这些内存管理的过程是完全透明不可见的。因此,程序员开发时从不关心系统如何为自己分配内存,而且永远认为系统可以分配给程序所需的内存。在程序开发时,程序员真正需要做的就是:申请内存、使用内存、释放内存。其它一概无需过问。本章的3个实验程序帮助同学们更好地理解从程序员的角度应如何使用内存。实验要求:练习一:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果,分析遇到的问题和解决方法。练习二:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。练习三:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。改编实验中的程序,并运行出结果。实验设备:多媒体电脑实验内容以及步骤:在虚拟机中编写好以下程序:#includestdio.h#includestring.h#includemalloc.hintmain(void){char*str;/*为字符串申请分配一块内存*/if((str=(char*)malloc(10))==NULL){printf(Notenoughmemorytoallocatebuffer\n);return(1);/*若失败则结束程序*/}/*拷贝字符串“Hello”到已分配的内存空间*/strcpy(str,Hello);/*显示该字符串*/printf(Stringis%s\n,str);/*内存使用完毕,释放它*/free(str);return0;}调试过后得出的结果截图如下:(由图可看出我将此程序以aa.c为文件名保存,调试后出现aa1文件,调试结果出现语句“StringisHello”)******#includestdio.h#includemalloc.h#includestring.hintmain(void){char*str;/*为字符串申请分配一块内存*/if((str=(char*)malloc(10))==NULL){printf(Notenoughmemorytoallocatebuffer\n);return(1);/*若失败则结束程序*/}/*复制Hello字符串到分配到的内存*/strcpy(str,Hello);/*打印出字符串和其所在的地址*/printf(Stringis%s\nAddressis%p\n,str,str);/*重分配刚才申请到的内存空间,申请增大一倍*/if((str=(char*)realloc(str,20))==NULL){printf(Notenoughmemorytoallocatebuffer\n);return(1);/*监测申请结果,若失败则结束程序,养成这个好习惯*/}/*打印出重分配后的地址*/printf(Stringis%s\nNewaddressis%p\n,str,str);/*释放内存空间*/free(str);return0;}调试过后得出结果截图如下:#includestdio.h******#includealloca.hvoidtest(inta){char*newstack;/*申请一块内存空间*/newstack=(char*)alloca(len);if(newstack)/*若成功,则打印出空间大小和起始地址*/printf(Alloca(0x%X)returned%p\n,len,newstack);else/*失败则报告错误,我们是做实验,目前无需退出*/printf(Alloca(0x%X)failed\n,len);}/*函数退出,内存自动释放,无需干预*/voidmain(){/*申请一块256字节大小的内存空间,观察输出情况*/test(256);/*再申请一块更大内存空间,观察输出情况*/test(16384);}调试结果截图如下:根据练习二改编程序如下:#includestdio.h#includemalloc.h#includestring.hintmain(void){char*str;/*为字符串申请分配一块内存*/if((str=(char*)malloc(20))==NULL){printf(Notenoughmemorytoallocatebuffer\n);return(1);/*若失败则结束程序*/}/*复制Hello字符串到分配到的内存*/strcpy(str,MynameisLiCaihong!);/*打印出字符串和其所在的地址*/printf(Stringis%s\nAddressis%p\n,str,str);/*重分配刚才申请到的内存空间,申请增大一倍*/******if((str=(char*)realloc(str,40))==NULL){printf(Notenoughmemorytoallocatebuffer\n);return(1);/*监测申请结果,若失败则结束程序,养成这个好习惯*/}/*打印出重分配后的地址*/printf(Stringis%s\nNewaddressis%p\n,str,str);/*释放内存空间*/free(str);return0;}在该程序中,我将程序中的“Hello”改为“MynameisLiCaihong!”首次调试出来的结果显示内存太小,出现的结果有很多不认识的代码。然后,我将程序中的“10”和“20”分别改成“20”和“40”再进行调试,得出结果截图如下:注:《实验内容及步骤》项目的内容如果较多,可以加附页。实验结果及心得:虽然本次试验我的改编程序没有什么技术含量,但是通过我仔细地阅读各个程序了解了他们的作用,并且能很快的知道哪个地方是最终现实的结果,结果的内存是有那个地方决定的。我觉得这对我来说也是一个不小的收获,为我未来更能编写出属于自己的程序打下了一个良好的基础。教师评语:成绩:教师签字:年月日