c语言链表内存分配失败,链表的C语言实现之动态内存分配

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

來源:互聯網  2008-06-01 02:05:07  評論

一、为什么用动态内存分配

但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组:

float score[30];

但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道该班级的学生数,但是假如因为某种非凡原因人数有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,非凡是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

那么有没有其它的方法来解决这样的外呢体呢?有,那就是动态内存分配。

所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于景泰内存分配的特点:

1、不需要预先分配存储空间;

2、分配的空间可以根据程序的需要扩大或缩小。

二、如何实现动态内存分配及其治理

要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数

1、malloc函数

malloc函数的原型为:

void *malloc (unsigned int size)

其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注重的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。

detail_1785338.html 更多内容请看C/C++进阶技术文档专题,或

下例是一个动态分配的程序:

#include

#include

main()

{

int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/

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函数是释放已经不用的内存区域的。

所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的治理了。

detail_1785338.html 更多内容请看C/C++进阶技术文档专题,或

一、为什么用动态内存分配

但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组:

float score[30];

但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?  在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道该班级的学生数,但是假如因为某种非凡原因人数有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,非凡是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

那么有没有其它的方法来解决这样的外呢体呢?有,那就是动态内存分配。

所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于景泰内存分配的特点:

1、不需要预先分配存储空间;

2、分配的空间可以根据程序的需要扩大或缩小。

二、如何实现动态内存分配及其治理

要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数

1、malloc函数

malloc函数的原型为:

void *malloc (unsigned int size)

其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注重的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。

[url=/bbs/detail_1785338.html][img]http://image.wangchao.net.cn/it/1323423839709.gif[/img][/url] 更多内容请看C/C++进阶技术文档专题,或

下例是一个动态分配的程序:

#include

#include

main()

{

int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/

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函数是释放已经不用的内存区域的。

所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的治理了。

[url=/bbs/detail_1785338.html][img]http://image.wangchao.net.cn/it/1323423839760.gif[/img][/url] 更多内容请看C/C++进阶技术文档专题,或

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转)你真的会写单例模式吗——Java实现

http://www.runoob.com/design-pattern/singleton-pattern.html 单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好、用对单例模式,还真得费一番脑筋。本文对Java中常见的单例模式写法做了一个总结,如有错漏之处&a…

c语言保存后怎么打开文件,保存打开文件之后,怎么也不能在显示函数中出来。。...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼抑郁了。。各位指点一下。。void WritetoText(Person per[],int n){int i0;FILE *fp; /*定义文件指针*/char filename[20]; /*定义文件名*/printf(…

BCGControlBar入门使用手册

BCGControlBar是MFC的一个扩展库,您可以用来构建类似于Microsoft Office 2000/XP/2003/2007/2010、Microsoft Visual Studio(打印、用户定制工具栏、菜单等)和其他一些知名产品的高级用户界面,例如:日历、网格、编辑和…

将list转为json字符串

//确保JSP和servlet的编码方式一致 resp.setContentType("text/html;charsetGBK"); List<String> jymdList new ArrayList<String>(); PrintWriter out null;try {//从数据库中取得ListjymdList efileViewUiService.getLymd();//简单粗暴,对于Map这句…

android分享图片功能实现原理,Android:简单实现并理解图片三级缓存

学习Android网络开发的过程中&#xff0c;势必会经历很多痛苦的过程&#xff0c;其中一个大坑就是图片缓存&#xff0c;当然现在有很多现成的库非常方便&#xff0c;常常几行代码就可以实现想要的功能&#xff0c;但不懂其中的原理是不行的&#xff0c;所以对于刚开始学习网络编…

android标题栏的属性,android – 属性“titleTextStyle”已经定义?

我已经导入一个Eclipse的android项目到android studio 1.2.2我的项目的gradle&#xff1a;dependencies {compile project(:unifiedPreferenceLib)compile project(:viewPagerIndicatorLib)compile project(:slidingUpFourSquare)compile project(:stylishDialogLib)compile pr…

Linux 之 编译器 gcc/g++参数详解

2016年12月9日16:48:53 ----------------------------- 内容目录&#xff1a; [介绍] gcc and g分别是gnu的c & c编译器 gcc/g在执行编译工作的时候&#xff0c;总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器e…

android 获取phone实例,android – 可以通过sdk来实例化一个telephony.Phone对象吗?

我正在尝试获取一个电话对象,以便我可以在我的应用程序内调用和会议两个数字.我已经尝试使用静态PhoneFactory.makeDefaultPhones((上下文))这个,但没有任何运气.String phoneFactoryName "com.android.internal.telephony.PhoneFactory";String phoneName "c…

连载 3:利用 matlab计算卷积

转载于:https://www.cnblogs.com/WHaoL/p/6155544.html

【Gradle】配置详解(持续更正补充)

1、build.gradle 工程构建文件。 顶级构建文件&#xff0c;为整个项目添加配置 // 声明gradle脚本自身需要使用的资源&#xff0c;包括依赖项、第三方插件、maven仓库地址等。 buildscript {// 声明仓库的源。之前这里用mavenCentral()repositories {jcenter() // jCenter可…

鸿蒙第一款手机,拿下“国内第一手机商”的OPPO,打算弃用华为鸿蒙?

在华为开发鸿蒙系统之前&#xff0c;我国是没有完全属于自己国家的手机系统&#xff0c;国内的操作系统一直被安卓ios系统所占据。尤其是在国产机中最主要的系统就是安卓&#xff0c;而安卓系统的所属方谷歌每年仅凭这一项系统就可以在中国净收数百亿的利益。许多国人也习惯了使…

namespace for c++

namespace中文意思是命名空间或者叫名字空间&#xff0c;传统的C&#xff0b;&#xff0b;只有一个全局的namespace&#xff0c;但是由于现在的程序的规模越来越大&#xff0c;程序的分工越来越细&#xff0c;全局作用域变得越来越拥挤&#xff0c;每个人都可能使用相同的名字来…

html5显示字母的值,使用HTML5 Canvas API控制字体的显示与渲染的方法

今天我们开始征战一个全新的内容——HTML5 Canvas的文本API&#xff01;要知道&#xff0c;艺术家通常同时也是一个书法家&#xff0c;所以我们要学习写字&#xff0c;而且是写出漂亮的字。是不是很有意思&#xff1f;好了&#xff0c;先预告一下Canvas 文本API有哪些。属性描述…

简易商品购物车

<html><head> <title>商品购物车</title><meta charset"utf-8"><style type"text/css"> body{ margin:0; padding:0; font-size:12px; line-height:20px; color:#333; } ul,li,ol,h1,dl,dd{ list-style:none; margin:…

html5 客户端数据缓存机制,深入理解HTML5离线缓存机制

TML5提供了一种离线应用缓存机制&#xff0c;使得网页应用可以离线使用&#xff0c;这种机制在移动端浏览器上支持度非常广&#xff0c;所有版本的android和ios浏览器都能很好的支持。我们可以放心的使用该特性来加速移动端页面的访问速度。开启离线缓存的步骤也非常简单&#…

安卓手机上运行 PC-E500 程序

目录 第1章安卓手机上运行 PC-E500 程序 1 1 PockEmul 1 2 下载 1 3 打包BASIC程序 2 4 配置PC-E500模拟器 5 5 载入e500.pkm 7 6 载入40000.bin 8 7 解包 10 第1章安卓手机上运行 PC-E500 程序 1 PockEmul 安卓手机上运行PC-E500程序&#xff0c;需要…

2021安徽省高考成绩怎么查询系统,2021年安徽省教育招生考试院成绩查询登录入口...

一、2020年安徽高考成绩查询登录入口二、安徽高考成绩查询新闻资讯最新消息!安徽高考预计7月23日划定各批次录取线并公布高考成绩!7月14日上午&#xff0c;记者跟随省人大代表、省政协委员们一同走进安徽省教育招生考试院网评现场。“今年&#xff0c;我省高考的网上评卷工作继…

Java Web之网上购物系统(提交订单、查看我的订单)

作业终于做完了&#xff0c;好开心。。。。。。虽然这一周经历不是那么顺利&#xff0c;但是觉得还是收获了不少&#xff0c;有过想哭的冲动&#xff0c;代码不会写&#xff0c;事情办不好&#xff0c;各种发愁。空间里发小发了带父母出去游玩的照片&#xff0c;瞬间能量值不知…

河北大学计算机专业调剂,【计算机考研调剂】河北大学2021级硕士研究生预调剂信息统计的通知...

广大考生&#xff1a;根据河北大学2021年硕士研究生招生计划&#xff0c;我院拟招收校内外调剂考生&#xff0c;欢迎广大考生调剂到我院。调剂要求&#xff1a;1、按照学校要求&#xff0c;申报我院调剂考生&#xff0c;初试总成绩和单科成绩不低于教育部公布的《2021年全国硕士…

撸表情开发过程中使用腾讯云存储的接入实例分享

推荐一下一个有趣的表情包收集网站&#xff0c;也可以在线制作表情包&#xff0c;欢迎访问&#xff1a;撸表情 撸表情&#xff08;http://www.lubiaoqing.com&#xff09;这个网站是业余时间开发的一个网站&#xff0c;涉及到大量表情包的检索和存储&#xff0c;个人服务器肯定…