LINUX编程-实验五 内存管理实验

更新时间:2024-05-11 08:25:01 阅读量: 综合文库 文档下载

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

实验五 内存管理实验

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 #include main() {

char *p;

clrscr(); // clear screen p=(char *)malloc(100); if(p)

printf(\ else

printf(\ free(p);

return 0;

}

(2) 5-2

#include #include main() {

char *p;

clrscr(); // clear screen p=(char *)calloc(100,sizeof(char)); if(p)

printf(\ else

printf(\ free(p); return 0; }

(3) 5-3

#include #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 #include #include int main() {

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);

//释放 heap 内存块 2

printf(\free(pbuf2);

//释放heap内存块 3

printf(\free(pbuf3);

//分配申明 heap 内存块 4

char *pbuf4 = (char *) malloc( HEAP_BLOCK_SIZE);

printf(\*pbuf4 = '4';

//分配申明 heap 内存块 5

char *pbuf5 = (char *) malloc( HEAP_BLOCK_SIZE);

printf(\*pbuf5 = '5';

//分配申明 heap 内存块 6

char *pbuf6 = (char *) malloc( HEAP_BLOCK_SIZE);

printf(\*pbuf6= '6'; for(;;) { }

Sleep(1000);

return 0; }

(7) 5-7

#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 内存块 3

printf(\free(pbuf3);

//释放 heap 内存块 2

printf(\free(pbuf2);

//释放heap内存块 1

printf(\free(pbuf1);

//分配申明 heap 内存块 4

char *pbuf4 = (char *) malloc( HEAP_BLOCK_SIZE);

printf(\*pbuf4 = '4';

//分配申明 heap 内存块 5

char *pbuf5 = (char *) malloc( HEAP_BLOCK_SIZE);

printf(\*pbuf5 = '5';

//分配申明 heap 内存块 6

char *pbuf6 = (char *) malloc( HEAP_BLOCK_SIZE);

printf(\*pbuf6= '6'; for(;;) { } return 0; }

Sleep(1000);

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

Top