第1关:利用malloc函数开辟动态存储单元,存放输入的3个整数,然后求这3个数中的最大值。
任务描述
本关任务:编写程序,利用malloc
函数开辟动态存储单元,存放输入的3
个整数,然后求这3
个数中的最大值。
相关知识
C 语言中内存管理十分重要,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是首先考虑的问题。 一个正在运行着的 C 编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区和栈区5
个部分。 1)代码区(text segment) 代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程)。如果反复,则需要使用跳转指令;如果进行递归,则需要借助栈来实现。 2)全局初始化数据区/静态数据区(Data Segment) 只初始化一次。 3)未初始化数据区(BSS) 在运行时改变其值。 4)栈区(stack) 由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。 5)堆区(heap) 用来存放由动态分配函数(如malloc
)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free
释放。如果忘记用free
释放,会导致所分配的空间一直占着不放,导致内存泄露。这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放。
内存的动态分配是通过系统提供的库函数来实现的,主要有malloc()
、 calloc()
、realloc()
和 free()
函数,这些函数的定义在头文件stdlib.h
中。
C 程序中,根据变量或常量的类型、作用域和存储属性, 把它们放到对应的内存区中,赋予了这些变量或常量不同的生命周期,不同的释放方式。根据程序的需要,在编码过程中,有更大的灵活性。
调用动态内存分配所需的系统函数时,要求在源文件中包下以下命令行:#include <stdlib.h>
。
分配内存空间函数malloc()
调用形式:(类型说明符*)malloc(size)
功能:在内存的动态存储区中,分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。 举例说明:
int *p;
p=(int *)malloc( sizeof(int) ); //p指向堆区的一个无名的int型变量
scanf("%d",p); //通过p给这个无名的变量赋值
printf("%d",*p); //通过p输出这个无名的变量的值
利用malloc()
函数在堆区创建了一个int
类型变量所需内存区域,一个int
类型变量所需内存区域长度可用sizeof(int)
得到,返回类型是void*
型的指针,将该void*
型的指针类型强制转换为int*
型指针类型,保存在指针变量p
中。该整型变量没有名字,只有地址,只能通过指针对此无名的int
型变量进行输入输出。 注意:malloc()
只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
释放内存空间函数free()
调用形式:free(void * p);
功能:释放p
所指向的一块内存空间,p
是一个任意类型的指针变量,它指向被释放区域的首地址。
int *p;
p=(int *)malloc( sizeof(int) ); //p指向堆区的一个无名的int型变量
scanf("%d",p); //通过p给这个无名的变量赋值
printf("%d",*p); //通过p输出这个无名的变量的值
free(p); //释放p指向的无名的变量
堆和栈的比较:
- 栈由系统自动分配。 例如,在函数中定义一个局部变量
int b;
系统自动在栈区中为b
开辟空间,当这个函数执行结束时,栈中的变量也将随之释放。 - 堆是需要程序员自己使用
malloc()
函数申请内存存储空间,自己使用free()
函数释放内存空间。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,从后台获取三个整数,依次保存在malloc
函数开辟动态存储单元,然后对三个数比较大小,输出最大值,输出格式参考测试说明的预期输出。
测试说明
平台会对你编写的代码进行测试。
测试输入: 64
25
43
预期输出: max=64
开始你的任务吧,祝你成功!
#include<stdio.h>
#include<stdlib.h>
int main()
{
int * p1, * p2, * p3,max;
p1 = (int *)malloc(sizeof(int)); //申请动态内存并将返回值保存在指针p1中
if(p1 == NULL) //检测动态内存分配是否成功
{
printf("不能成功分配存储空间。\n");
exit(1);
}
if ( ( p2 = (int *)malloc(sizeof(int) ) ) == NULL ) // 申请动态内存并且检测是否成功
{
printf("不能成功分配存储空间。\n");
exit(1);
}
/**********申请动态内存并将返回值保存在指针p3中 **********/
/********** Begin **********/
p3=(int *)malloc(sizeof(int));
/********** End **********/
/**********输入3个整数求最大值并输出 **********/
/********** Begin **********/
scanf("%d%d%d",p1,p2,p3);
max=*p3;
if(*p2>max)
max=*p2;
if(*p1>max)
max=*p1;
printf("max=%d",max);
/********** End **********/
free(p1); //释放p1指向的堆内存
/**********释放p2指向的堆内存 **********/
/********** Begin **********/
free(p2);
/********** End **********/
/**********释放p3指向的堆内存 **********/
/********** Begin **********/
free(p3);
/********** End **********/
return 0;
}