C语言编程基础学习中的动态管理所用函数

C语言是面向过程的,而C++是面向对象的

C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

一个正在运行的程序,需要将需要的数据组织的存放在内存空间,可以是程序员自己动态申请的内存空间(堆),也可以是在运行时系统自动的分配内存空间(栈)用来存放函数调用的活跃记录,以备程序使用,所以了解内存组织结构、堆栈区别以及动态管理的一些函数还是很重要的。今天介绍这些动态分配内存函数为后面介绍数据结构最基本的线性表做好准备,因为会用到。

一、堆与栈:

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

C程序在内存中的组织方式

通过上图可以看到,堆用来动态的分配内存空间,如用函数malloc、calloc函数等,用于程序动态分配和释放的自由存储空间,也就称为堆。

说明:堆一般由程序员释放,如果不释放,程序结束是可能会被os回收。

栈用来存储函数的参数、局部变量、等来保存函数调用的相关信息,当程序调用函数或声明局部变量时系统会自动分配内存空间,它被用来在函数之间传递参数,学过汇编就会对栈有进一步的认识,你会知道寄存器ss/esp跟栈的关系。

特点:先进后出。当程序需要先进后出这种数据结构时,栈最为合适。(函数递归就合适,上图最后一个框就是函数发生调用时的栈中情况)

二、malloc函数:

函数原型:void *malloc(unsigned int size)。

作用:是在堆中动态的分配一块大小为size字节的内存空间。

返回值:成功返回一个指向分配的内存空间的指针,失败返回NULL。

该函数返回一个void *的指针,因此一定要显示转换为需要的指针类型。

举个例子说明:

int *p=(int *)malloc(sizeof(int)),如果在函数中有一条这样的语句,那么系统会在栈中保存一块指针信息,而该指针指向的是在堆中分配的一块内存的首地址,当该函数返回时,栈被销毁,但是注意,它销毁的是栈,并不是堆,指针变量是被销毁了,但堆中分配的内存还在,所以在函数返回前一点要先释放堆中申请的空间,free()函数。

malloc运作机制:

操作系统中有一记录空闲内存地址的链表,当系统接收到分配内存的申请时,系统就会遍历该链表,然后寻找一块大于所申请空间的结点,然后将该结点删除,而后将结点空间分配给程序。但是返回的内存一般比申请的要大,是因为有一部分记录该内存相关信息,当释放(free函数)内存空间时,可以将该内存块链接到空闲链上。

二、calloc函数:

原型:

void *calloc(unsigned n,unsigned size)。

作用:在内存堆中动态分配n个长度为size的连续内存空间。

返回值:申请成功,返回一个指针,该指针指向分配内存的起始地址,失败返回NULL。

与上面malloc区别在于,其一、malloc分配的内存空间,里面的数值是杂乱的,不会对其初始化,原先是什么信息,里面就是什么样的,不会变动,而calloc会对分配的空间其初始化,如整形就初始化为0,指针型就初始化为NULL。

其二、在用calloc函数时,如果对分配的存储空间不保存那么丢失后就无法找会来,更糟糕的是,这段空间不能再重新分配,因此会造成内存浪费,因此我们一般推荐使用malloc函数。

三、free函数:

原型:

void free(void *p)。

指针p是指向最近一次由malloc或calloc函数动态分配的内存空间。

作用:让动态分配的内存空间,交还给系统,使系统可以重新对其分配,使部分内存区能被其他变量使用。

如果p=NULL,free不会有任何作用。但是不能对一个有指向的指针两次释放,那样会导致程序出错。

注意事项:free函数释放的是内存空间,不会改变指针变量的值,所以此时指针变量仍然会指向相同的内存空间,只不过该内存空间以无效,不能再被使用。

free函数不能释放任意空间,只能释放由malloc calloc realloc分配出来的内存空间。

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

四、realloc函数:

原型如下:

void *realloc(void *ptr,size_t size)。

功能:改变ptr指针指向的空间大小为size。当然size的大小可以任意,返回一个指向新地址的指针,不一定等于原来的指针。

注意:新分配后的地址不一定与原来相同,因为如果需要增加空间,如果当前内存段后面空闲的内存不够,那么存储区会进行必要的移动,当然减少空间的话也就是仅仅改变索引信息而已。

由realloc分配的空间也应该用free函数回收,以免造成内存浪费。

如果申请失败,函数返回NULL,原来的指针仍然有效。

上面就是动态分配内存的一些函数,主要作用是为后面介绍数据结构中线性表做好铺垫。今天就简单介绍这些函数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是...
    一生信仰阅读 1,162评论 0 2
  • 前言 C语言作为一门应用途广泛、功能强大、使用灵活的面向过程式编程语言。既可用于编写应用软件,又能用于编写系统软件...
    老板娘来盘一血阅读 12,987评论 32 83
  • 固定时间做固定事情,是培养自己的微习惯的不二法则,同时,稍微掂一下脚就可以完成,还有一个反馈的方法让你看得见的量度...
    大麦茶的故事阅读 457评论 0 0
  • 我想找一个男朋友,好好想爱, 在听王童语的《丫头》,想找个男朋友的感觉很强烈,之前,我以为的男朋友,在他眼里是什么...
    默默的路过阅读 156评论 0 0
  • 我做了一个噩梦,却没让我惊恐尖叫,我在中途好像醒过一次,可是一闭眼,又顺着梦境在往前走。 我好像杀了人,不,也许不...
    _Pandaaaaa阅读 319评论 0 0