实验五 内存管理实验
1. 目的要求
(1) 学习使用内存管理库函数。 (2) 学习分析、改正内存错误。
2. 实验内容
(1) 内存库函数实验 ?
malloc函数
原型:extern void *malloc(unsigned int num_bytes); 头文件:#include
功能:分配长度为num_bytes字节的内存块。
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。 举例:运行程序清单5-1,写明运行结果: _
?
______________________________________________________________________________________________________________________________________________________________ calloc函数
原型:extern void *calloc(int num_elems, int elem_size); 头文件:#include
功能:为具有num_elems个长度为elem_size元素的数组分配内存。
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。 举例:运行程序清单5-2,写明运行结果:
________
______________________________________________________________________________________________________________________________________?
_________________ realloc函数
原型:extern void *realloc(void *mem_address, unsigned int newsize); 头文件:#include
功能:改变mem_address所指内存区域的大小为newsize长度。
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
举例:运行程序清单5-3,写明运行结果: ___
____________________________________________________________________________________________________________________________________________________________ (2) 内存错误分析实验
分析1:指出程序清单5-4的内存错误原因。
错误原因:___ ApplyForMem(char *p,int num)是不能传递动态内存的,
这样main函数当中Str始终都是
NULL____________________________________________________________________________________________________________________________________________________________
分析2:指出程序清单5-5的内存错误原因。
错误原因:____ (const char *)没有具体指明内存地址,这个写法表示从地址0处取一个字符,而地址0是没有东西的
________________________________________________________________________________________________________________________________________
___________________
分析3:通过比较程序清单5-6、5-7输出结果,分析程序5-3内存错误原因 程序5-6运行结果
_______________________________________________________________________________________________________________________________________________________________ 程序5-7运行结果 ___
???____________________________________________________________________________________________________________________________________________________________ 错误原因
__程序5-6释放内存的顺序和分配内存的顺序不对应。
_____________________________________________________________________________________________________________________________________________________________ 经验总结
______堆分配内存后,释放内存的顺序应该和分配内存的逆序,这样才能保证释放内存的顺序的正确性。
________________________________________________________________________________________________________________________________________________________
3. 主要仪器设备及软件
(1) 硬件:计算机、网络
(2) 软件:VMWare workstation、RedHat 9.0 4. 附录:程序清单if()
(1) 5-1
#include
char *p;
clrscr(); // clear screen p=(char *)malloc(100); if(p)
printf(\ else
printf(\ free(p);
return 0;
}
(2) 5-2
#include
char *p;
clrscr(); // clear screen p=(char *)calloc(100,sizeof(char)); if(p)
printf(\ else
printf(\ free(p); return 0; }
(3) 5-3
#include
main() {
char *p;
clrscr(); // clear screen p=(char *)malloc(100); if(p)
printf(\ else
printf(\ p=(char *)realloc(p,256); if(p)
printf(\ else
printf(\ free(p); return 0; }
(4) 5-4
……
Void ApplyForMem(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num); return; }
int main() {
char *str=NULL; ………….
ApplyForMem(str,300); free(str); infile.close(); return 0; }
(5) 5-5 #include
char z = *(const char *)0; exit(EXIT_SUCCESS); }
(6) 5-6 #include “stdlib.h”
#define HEAP_BLOCK_SIZE 32 int main() {
// 分配申明 heap 内存块 1
char *pbuf1 = (char *) malloc(HEAP_BLOCK_SIZE);
printf(\*pbuf1 = '1';
//分配申明 heap 内存块 2
char *pbuf2 = (char *) malloc(HEAP_BLOCK_SIZE);
printf(\*pbuf2 = '2';
//分配申明 heap 内存块 3
char *pbuf3 = (char *) malloc(HEAP_BLOCK_SIZE);
printf(\*pbuf3 = '3';
// 释放 heap 内存块 1
printf(\free(pbuf1);