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. Web前端之html_day2
  2. LeetCode 88合并两个有序数组89格雷编码
  3. python提高运行效率_提高 Python 运行效率的六个窍门
  4. [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】
  5. eval 函数 代替函数_eval()函数以及JavaScript中的示例
  6. 第三十一期:QQ for Linux 复活,微信 for Linux 还远吗?
  7. GitKraken - 简单教程
  8. 不止承上启下,带你了解工业物联网关
  9. 电脑重装系统需要全盘格式化吗?这个事项需要看情况
  10. C++11 关键字override和final
  11. 一如此前的回应,王劲将景驰科技总部搬到了广州
  12. 【图像隐写】基于matlab GUI DWT+SVD数字水印【含Matlab源码 606期】
  13. MonkeyTest脚本
  14. VBScript基础
  15. wsus下游服务器状态,计算机长期没有向WSUS报告状态
  16. GET、POST、PUT、DELETE等用法
  17. 吃芋头相当于注射免疫球蛋白
  18. 动态规划------求解决策过程中最优化的数学方法
  19. 想比较全面地学习 SAP XXX,能指导下从哪儿开始学习吗?
  20. 54:第五章:开发admin管理服务:7:人脸入库流程;人脸登录流程;浏览器开启视频调试模式(以便能够在本机的不安全域名的情况下,也能去开启摄像头);

热门文章

  1. css盒子模型、边框border、外边距margin、填充padding、轮廓outline
  2. 收藏 | 数据分析师最常用的10个机器学习算法!
  3. javascript 点点滴滴 jquery
  4. python操作excel表格文件--使用xlrd模块
  5. Hbase集群搭建二(Hadoop搭建)
  6. C++实现 找出10000以内的完数
  7. 微信jssdk批量添加卡券接口(踩坑经验)
  8. iOS开发学无止境 - UICollectionView自定义布局之风火轮[译]
  9. SQL总结(三)其他查询
  10. No identities are available for signing的解决方法