美文网首页C语言#语法程序员
C语言编程基础学习中的动态管理所用函数

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

作者: 小辰带你看世界 | 来源:发表于2018-03-09 15:06 被阅读35次

    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,原来的指针仍然有效。

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

    相关文章

      网友评论

        本文标题:C语言编程基础学习中的动态管理所用函数

        本文链接:https://www.haomeiwen.com/subject/wrtefftx.html