头歌链表专题实训1

第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"字节的连续区域。函数的返回值为该区域的首地址。   举例说明:

 
  1. int *p;
  2. p=(int *)malloc( sizeof(int) ); //p指向堆区的一个无名的int型变量
  3. scanf("%d",p); //通过p给这个无名的变量赋值
  4. printf("%d",*p); //通过p输出这个无名的变量的值

  利用malloc()函数在堆区创建了一个int类型变量所需内存区域,一个int类型变量所需内存区域长度可用sizeof(int)得到,返回类型是void* 型的指针,将该void* 型的指针类型强制转换为int*型指针类型,保存在指针变量p中。该整型变量没有名字,只有地址,只能通过指针对此无名的int型变量进行输入输出。   注意malloc()只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。

释放内存空间函数free()

  调用形式:free(void * p);   功能:释放p所指向的一块内存空间,p是一个任意类型的指针变量,它指向被释放区域的首地址。

 
  1. int *p;
  2. p=(int *)malloc( sizeof(int) ); //p指向堆区的一个无名的int型变量
  3. scanf("%d",p); //通过p给这个无名的变量赋值
  4. printf("%d",*p); //通过p输出这个无名的变量的值
  5. 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值