实验九动态内存一实验目的1)理解并掌握动态内存的概念与申请、使用和释放的方法;2)熟悉使用自定义函数进行动态内存分配与使用的方法。二程序示例[源程序2-1]用malloc动态申请内存并释放示例。1#include<stdio.h>2#include<stdlib.h>3void main()4int count,*array;5if(array=(int*)malloc(10*sizeof(int))==NULL)//申请空间6(7print("不能成功分配存储空间\n");8exit(1);9110for(count=0;count<10;count++)//数组赋值11array[count]=count;12for(count=0;count<10;count++)//数组输出13printf("%2d)n",array[count);14free(array);//释放内存15[程序输出]12345678
实验九 动态内存 一 实验目的 1) 理解并掌握动态内存的概念与申请、使用和释放的方法; 2) 熟悉使用自定义函数进行动态内存分配与使用的方法。 二 程序示例 [源程序 2-1] 用 malloc 动态申请内存并释放示例。 1 #include <stdio.h> 2 #include <stdlib.h> 3 void main(){ 4 int count,*array; 5 if((array=(int *) malloc(10*sizeof(int)))==NULL) //申请空间 6 { 7 printf("不能成功分配存储空间\n"); 8 exit(1); 9 } 10 for (count=0;count<10;count++)//数组赋值 11 array[count]=count; 12 for(count=0;count<10;count++)//数组输出 13 printf("%2d\n",array[count]); 14 free(array); //释放内存 15 } [程序输出] 1 2 3 4 5 6 7 8
9[程序分析]void*malloc(unsigned intsize)的作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。上例第5行动态分配了10个整型存储区域,然后在第10-11行通过循环进行赋值,第10-11行进行打印输出。例中if((array=(int*)malloc(10*sizeof(int)))==NULL)语句可按如下步骤分析:1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针2)把此整型指针地址赋给array3)检测返回值是否为NULL由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。其函数原型是:void free(void *p)其作用是释放指针p所指向的内存区,其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。[源程序2-2]数组和指针示例。A#include<stdio.h>2#include<stdlib.h>3void main()415int *number;6inti= O;7number=(int*)calloc(3,sizeof(int);//申请内存8if(NULL==number)//判断申请是否成功9exit(0);101
9 [程序分析] void *malloc (unsigned int size)的作用是在内存的动态存储区中分配一个长 度为 size 的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的 连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存 储空间(如内存不足)就会返回一个 NULL 指针。所以在调用该函数时应该检测 返回值是否为 NULL 并执行相应的操作。 上例第 5 行动态分配了 10 个整型存储区域,然后在第 10-11 行通过循环进 行赋值,第 10-11 行进行打印输出。例中 if((array=(int *) malloc(10*sizeof(int)))==NULL) 语句可按如下步骤分析: 1)分配 10 个整型的连续存储空间,并返回一个指向其起始地址的整型指针 2)把此整型指针地址赋给 array 3)检测返回值是否为 NULL 由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节 省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程 序使用。这时我们就要用到 free 函数。其函数原型是: void free(void *p) 其作用是释放指针 p 所指向的内存区,其参数 p 必须是先前调用 malloc 函数或 calloc 函数(另一个动态分配存储区域的函数)时返回的指针。给 free 函数传递 其它的值很可能造成死机或其它灾难性的后果。 [源程序 2-2] 数组和指针示例。 1 #include <stdio.h> 2 #include <stdlib.h> 3 void main() 4 { 5 int *number; 6 int i = 0; 7 number = (int *)calloc(3,sizeof(int)); //申请内存 8 if(NULL == number){ //判断申请是否成功 9 exit(0); 10 }
11for(;i<3;i++)12printf("address:%d number[%d] = %d)n",&number[i],;i,number[i]13114free(number);//释放内存15 1[程序输出]pfun=sumresult = 15pfun=productresult=50pfun=different result = 5[程序分析]本程序第7行使用calloc函数申请3块内存,每块内存大小是sizeof(int),并把每个元素初始化为0,返回的指针需要强转成需要的类型,第8行通过返回指针数值判断空间申请是否成功,如果指针为NULL则表示申请不成功:申请内存使用之后需要通过free函数进行释放(第14行)。三、程序编写编写程序计算从键盘输入的任意个浮点数的平均值,要求:1.将所有的待平均数据存储到动态内存分配的内存中;2.最终显示平均值,小数点后保留1位;3.动态内存的申请与操作均在自定义函数中完成,主程序中调用此函数
11 for(;i<3;i++){ 12 printf(“address:%d number[%d] = %d\n”,&number[i],i,number[i]); 13 } 14 free(number); //释放内存 15 } [程序输出] pfun = sum result = 15 pfun = product result = 50 pfun = different result = 5 [程序分析] 本程序第 7 行使用 calloc 函数申请 3 块内存,每块内存大小是 sizeof(int),并 把每个元素初始化为 0,返回的指针需要强转成需要的类型,第 8 行通过返回指 针数值判断空间申请是否成功,如果指针为 NULL 则表示申请不成功;申请内存 使用之后需要通过 free 函数进行释放(第 14 行)。 三、程序编写 编写程序计算从键盘输入的任意个浮点数的平均值,要求: 1. 将所有的待平均数据存储到动态内存分配的内存中; 2. 最终显示平均值,小数点后保留 1 位; 3. 动态内存的申请与操作均在自定义函数中完成,主程序中调用此函数