链表的C语言实现之动态内存分配

2016-02-19 20:51 10 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的链表的C语言实现之动态内存分配,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】

一、为什么用动态内存分配
  
  但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组:
  float score[30]; !-- frame contents -- !-- /frame contents --   但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?  在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道该班级的学生数,但是假如因为某种非凡原因人数有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,非凡是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。
  
  那么有没有其它的方法来解决这样的外呢体呢?有,那就是动态内存分配。
  
  所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于景泰内存分配的特点:
  
  1、不需要预先分配存储空间;
  
  2、分配的空间可以根据程序的需要扩大或缩小。
  
  二、如何实现动态内存分配及其治理
  
  要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数
  
  1、malloc函数
  
  malloc函数的原型为:
  void *malloc (unsigned int size)
  其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注重的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
  
更多内容请看C/C++进阶技术文档专题,或
  下例是一个动态分配的程序:
  #include
  #include
  main()
  {
   int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
   !-- frame contents -- !-- /frame contents --  if((array(int *) malloc(10*sizeof(int)))==NULL)
   {
  printf("不能成功分配存储空间。");
  exit(1);
   }
   for (count=0;count〈10;count++) /*给数组赋值*/
  array[count]=count;
   for(count=0;count〈10;count++) /*打印数组元素*/
  printf("%2d",array[count]);
  }
  上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
  
  1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
  
  2)把此整型指针地址赋给array
  
  3)检测返回值是否为NULL
  
  2、free函数
  
  由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
  
  其函数原型是:
  void free(void *p)
  作用是释放指针p所指向的内存区。
  
  其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。
  
  
  注重:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:
  int *p1,*p2;
  p1=malloc(10*sizeof(int));
  p2=p1;
  ……
  free(p2) /*或者free(p2)*/
  malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。
  
  malloc函数是对存储区域进行分配的。
  
  free函数是释放已经不用的内存区域的。
  
  所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的治理了。
更多内容请看C/C++进阶技术文档专题,或

来源:http://www.tulaoshi.com/n/20160219/1624712.html

延伸阅读
C语言以其简洁、灵活、表达能力强,产生的目标代码质量高,可移植性好而著称于世。巧妙、灵活地运用C可以进一步挖掘出其潜在的功能。 1、字符数组和字符指针 指针和数组是C最具特色的一部分。数组是占用预分配的连续空间,C语言中对连续空间的访问可以有以下几种方法:加下标构成数组是最直接的;常量字符串也可...
链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语言和C++语言中是用指针来实现链表结构的,由于Java语言不提供指针,所以有人认为在Java语言中不能实现链表,其实不然,Java语言比C和C++更轻易实现链表结构。Java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写...
在嵌入式系统中使用C++的一个常见问题是内存分配,即对new 和 delete 操作符的失控。 具有讽刺意味的是,问题的根源却是C++对内存的治理非常的轻易而且安全。具体地说,当一个对象被消除时,它的析构函数能够安全的释放所分配的内存。 这当然是个好事情,但是这种使用的简单性使得程序员们过度使用new 和 delete,而不注重在嵌入式...
  这是我学数据结构编写的算法,我把他整理出来,都是基本算法,供大家学习。我使用c++面向对象形式编写,各种算法都封装在各自的类里,假如想增加功能,在相应的类里增加函数即可。我对树和图的构造也做了一些人性化设计,输入更加形象化,你可能看不懂,没关系漫漫来。各种类都使用模版设计,可以对各种数据类型操作(整形,字符,...
1.图像平移 图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。 假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0 + dx, y0 + dy),右下角坐标为(x1 + dx, y1 + dy)。坐标平移变换公式为: x′ = x + dx y′ = y + dy...

经验教程

326

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部