topoic=静态存储分配

  在数组一章中,曾引见过数组的长度是事后定义好的, 在整个法式中结实稳定。C言语中不答理静态数组类型。比方: int n;scanf("%d",&n);int a[n]; 用变量暗示长度,想对数组的大小作静态阐明');, 这是错误的。然则在实际的编程中,往往会发作这种状况, 即所需的内存空间取决于实际输入的数据,而无法事后确定。关于这种成就, 用数组的行动很难明决。为了料理上述成就,C言语供应了一些内存治理函数,这些内存治理函数可以按需求静态地分配内存空间, 也可把不再运用的空间收受接纳待用,为有效地把持内存资本供应了手腕。 常用的内存治理函数有以下三个:

1.分配内存空间函数malloc
调用形式: (类型阐明');符*) malloc (size) 服从:在内存的静态存储区平分配一块长度为"size" 字节的连续区域。函数的前去值为该区域的首地点。 “类型阐明');符”暗示把该区域用于何种数据类型。(类型阐明');符*)暗示把前去值强逼转换为该类型指针。“size”是一个无标记数。比方: pc=(char *) malloc (100); 暗示分配100个字节的内存空间,并强逼转换为字符数组类型, 函数的前去值为指向该字符数组的指针, 把该指针付与指针变量pc。

2.分配内存空间函数 calloc
calloc 也用于分配内存空间。调用形式: (类型阐明');符*)calloc(n,size) 服从:在内存静态存储区平分配n块长度为“size”字节的连续区域。函数的前去值为该区域的首地点。(类型阐明');符*)用于强逼类型转换。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。比方: ps=(struet stu*) calloc(2,sizeof (struct stu)); 此中的sizeof(struct stu)是求stu的布局长度。是以该语句的意思是:按stu的长度分配2块连续区域,强逼转换为stu类型,并把其首地点付与指针变量ps。

3.开释内存空间函数free
调用形式: free(void*ptr); 服从:开释ptr所指向的一块内存空间,ptr 是一个随便类型的指针变量,它指向被开释区域的首地点。被开释区应是由malloc或calloc函数所分配的区域:[例7.9]分配一块区域,输入一个高足数据。
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
printf("Number=%d\nName=%s\n",ps->num,ps->name);
printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
free(ps);
}
  本例中,定义了却构stu,定义了stu类型指针变量ps。 然后分配一块stu大内存区,并把首地点付与ps,使ps指向该区域。再以ps为指向布局的指针变量对各成员赋值,并用printf 输入各成员值。最初用free函数开释ps指向的内存空间。 整个法式包括了乞求内存空间、运用内存空间、开释内存空间三个步骤, 完成存储空间的静态分配。链表的不雅观点在例7.9中接纳了静态分配的行动为一个布局分配内存空间。每一次分配一块空间可用来寄存一个高足的数据, 我们可称之为一个结点。有几多个高足就应该乞求分配几多块内存空间, 也就是说要竖立几多个结点。固然用布局数组也可以完成上述使命, 但假设事后不克不及正确把握高足人数,也就无法确定命组大小。 并且当高足留级、退学之后也不克不及把该元素占用的空间从数组中开释出来。 用静态存储的行动可以很好地料理这些成就。 有一个高足就分配一个结点,无须事后确定高足的正确人数,某高足退学, 可删去该结点,并开释该结点占用的存储空间。从而节流了宝贵的内存资本。 另一方面,用数组的行动必须占用一块连续的内存区域。 而运用静态分配时,每个结点之间可以是不连续的(结点内是连续的)。 结点之间的联结可以用指针完成。 即在结点布局中定义一个成员项用来寄存下一结点的首地点,这个用于寄存地点的成员,常把它称为指针域。可在第一个结点的指针域内存入第二个结点的首地点, 在第二个结点的指针域内又寄存第三个结点的首地点, 如此勾结下去直到最月朔个结点。最月朔个结点因无后续结点邻接,其指针域可赋为0。这样一种邻接行动,在数据布局中称为“链表”。图7.3为链表的暗示图。

  在图7.3中,第0个结点称为头结点, 它寄存有第一个结点的首地点,它没罕见据,只是一个指针变量。 以下的每个结点都分为两个域,一个是数据域,寄存各类实际的数据,如学号num,姓名name,性别sex和成就score等。另一个域为指针域, 寄存下一结点的首地点。链表中的每一个结点都是同一种布局类型。比方, 一个寄存高足学号和成就的结点应为以下布局:
struct stu
{ int num;
int score;
struct stu *next;
}
  前两个成员项构成数据域,后一个成员项next构成指针域, 它是一个指向stu类型布局的指针变量。链表的基本操为难');刁难链表的主要把持有以下几种:
1.竖立链表;
2.布局的查找与输入;
3.拔出一个结点;
4.删除一个结点;
下面经过议定例题来阐明');这些把持。
[例7.10]竖立一个三个结点的链表,寄存高足数据。 为俭朴起见, 我们假定高足数据布局中只要学号和年龄两项。
可编写一个竖立链表的函数creat。法式如下:
#define NULL 0
#define TYPE struct stu
#define LEN sizeof (struct stu)
struct stu
{
int num;
int age;
struct stu *next;
};
TYPE *creat(int n)
{
struct stu *head,*pf,*pb;
int i;
for(i=0;i<n;i )
{
pb=(TYPE*) malloc(LEN);
printf("input Number and Age\n");
scanf("%d%d",&pb->num,&pb->age);
if(i==0)
pf=head=pb;
else pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}
  在函数外首先用宏定义对三个标记常量作了定义。这里用TYPE暗示struct stu,用LEN暗示sizeof(struct stu)主要的方针是为了在以下法式内镌汰誊写并使阅读愈加随便。布局stu定义为内部类型,法式中的各个函数均可运用该定义。

版权声明: 原创作品,答理转载,转载时请务必以超链接形式标明文章 原始来因 、作者信息和本声明。不然将追查功令责任。

转载于:https://www.cnblogs.com/zgqjymx/archive/2011/03/07/1975582.html

C语身教程第七章:布局与联结(5)相关推荐

  1. C语身教程第三章: C说话挨次筹算匹面(1)

    C说话挨次筹算 本课先容C说话挨次筹算的根基要领和根基的挨次语句. 从挨次流程的角度来看,挨次可以分为三种根基构造, 即挨次构造.分支构造.循环构造. 这三种根基构造可以组玉成部的种种重年夜挨次.C说 ...

  2. 2017.2.12 开涛shiro教程-第七章-与Web集成

    2017.2.9 开涛shiro教程-第七章-与Web集成(一) 原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. ...

  3. 计算机应用教程第七章,计算机应用基础(第7章)教程.doc

    计算机应用基础(第7章)教程 第七章 医院信息系统 医院信息系统是一种综合管理科学.信息科学.系统科学.计算机科学.网络通信技术及数据库技术的处理医院各种信息的技术.医学院校的学生今后要走上社会,进入 ...

  4. 微信小程序开发教程第七章:微信小程序编辑名片页面开发

    前面我们更新了六篇的微信小程序开发教程,现在更新第七章:微信小程序编辑名片页面开发,(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程 ...

  5. 偏微分方程简明教程第七章部分答案

    偏微分方程简明教程答案 第七章 Fourier变换及其应用 习题7.1 7.1.1 第七章 Fourier变换及其应用 习题7.1 7.1.1 1.按定义求下列函数的 F o u r i e r Fo ...

  6. CE教程 第七章 《多级指针》

    步骤 8: 多级指针: (密码=525927) 这一步教学将会解释该如何使用多级指针.在第 6 步的教学中你应该了解到简单的1级指针的概念和用途, 以及如何由数据的地址找到真正的基址.在本步教学中,你 ...

  7. cobaltstrike扩展_Cobalt Strike系列教程第七章:提权与横向移动

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  8. [统计学教程] 第七章 假设检验

    导读: 第七章 假设检验 第一节 检验原理 一.提出原假设( Null Hypothesis)和备择假设(Alternative Hypothesis): 所谓假设,是指需要进行验证的统计结论. 原假 ...

  9. matlab 四叶草,Matlab入门教程 第七章 Simulink 基础

    第七章 Simulink 基础 Chapter 7: Introduction to Simulink 一.Simulink 初步(Primer of Simulink) MATLAB Simulin ...

最新文章

  1. 云计算机机房怎么样,如何知道云电脑配置多少?怎么选择云电脑机房?
  2. 英特尔成立物联网视频事业部,这届IESS还揭露了哪些信息?
  3. DPDK — 安装部署(CentOS 7)
  4. 转 C# 串口编程遇到的问题以及解决方法
  5. 等式约束和不等式约束下的KKT条件求法
  6. OpenCV学习笔记-关于使用Mat.at(i,j) = int 语法报错
  7. [Ajax] 超于json2.js的版本json3.js
  8. 机器学习算法(2)——AdaBoost算法
  9. .Net开发人员通过WCF使用Node.js
  10. 《Essential C++》笔记之设定头文件
  11. 精读《useEffect 完全指南》
  12. 电容的串联和并联的性质
  13. 空间管理 - 碎片化问题及解决思路
  14. Vue的内容抽离过程
  15. 大数据的接触,带你初步认识什么是大数据,云计算以及物联网
  16. 诺顿误杀系统文件 导致百万台电脑处于崩溃边缘
  17. 一个Java 程序的主方法_java application程序中,每一个类中,必有一个主方法main()方法。...
  18. typora修改主题和字体
  19. 如何精准实现OCR文字识别?
  20. 迷你英雄无限服务器没了吗,迷你英雄:无限无法连接服务器是什么原因

热门文章

  1. DataRow复制一行到另一个DataTable
  2. 记录Datagrid使用的一些事项
  3. 关于极光IM设置昵称不生效的解决办法
  4. 自学linux指令分析-cat
  5. c++中的字符集与中文
  6. 【Oracle 常用查询】oracle表空间使用率统计查询
  7. JCIFS实现单点登录
  8. 国外的开源的CMS汇总(转载)
  9. NetTiers中的一些内置对象及关系
  10. 如何让button保持点击状态