C语言中数据结构,栈,堆

最简单的数据结构:数组

为什么要有数组?因为程序中有许多类型相同 意义相关的变量需要管理,这个时候如果用单独的变量来做程序看起来比较乱,用数组来管理会更好管理。比如:int age[20];

数组的优势和缺陷

优势:数组比较简单,访问用下标,可以随机访问。

缺陷:数组中所有元素类型必须相同;数组大小必须定义时给出,而且一旦确定不能在改。

结构体发明出来就是为了解决数组的第一个缺陷。

C语言是面向过程的,但是C语言写出的LINUX系统是面向对象的,非面向对象的语言,不一定不能实现面向对象的代码,只是说面向对象的语言写出来的代码更直观一些。C++ 面向对象的语言简单一些。

栈是一种数据结构,C语言中使用栈来保存局部变量。栈是被发明出来管理内存的。

top指针可以上下移动,bottom指针不可以移动

先进后出 FILO first in last out 栈

先进先出 FIFO first in first out 队列

栈的特点是入口即出口,只有一个入口,另一个口是堵死的,所以先进去必须后出来。

C语言中的局部变量是用栈来实现的。

我们在C中定义个一个变量时(int a )编译器会在栈中分配一段空间(4个字节)给这个局部变量用(分配时栈顶指针会涌动给出空间,给局部变量a用的意思是,就是将4字节的栈内存地址和我们定义的局部变量名a给关联起来)注意:栈指针移动和内存分配是自动的,等我们函数退出的时候局部变量要灭亡,对应的栈的操作是出站 。出站时也是栈顶指针释放,将栈空间与a关联的那4个字节空间释放,自动的。

栈的优点:方便,分配和回收都是自动的,也不用管理员操心。

定义局部变量,其实就是在栈中通过移动指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈是反复使用的(栈中内存是反复使用的,上次用完是没有清零的)。

栈的缺点:栈是有大小的。所以栈内存不太灵活,大小不好设置,太小溢出,太大浪费,所以在C语言中定义局部变量时不能定义太多或者太大,使用递归解决问题时,要注意递归收敛。

堆是一种内存管理方式,对这种内存管理方式特点就是自由(随时申请,释放:大小块随意)。堆内存是操作系统划分给堆管理器来管理的,然后向使用者提供API来使用堆内存。

什么时候会用堆内存?需要内存容量比较大,需要反复使用及其释放时,很多数据结构(比如链表)的实现都要使用堆内存。

堆内存的特点:(大块内存,手工分配,使用,释放)

1.容量不限

2.申请及其释放都需要手工进行,需要程序员写代码申请释放,使用后未释放这段内存就丢失(管理器中有进程但是进程自己以为这个内存不用了,在用的时候又会去申请新的内存块,叫吃内存 )了,叫内存泄露.。

堆内存释放时直接调用free即可。 void free(void *ptr);

堆内存申请时,有3个可选择的类似功能的函数:malloc, calloc, realloc

void *malloc(size_t size);

void *calloc(size_t nmemb,size_t size);   //       nmemb个单元,每个单元size字节

void *realloc(void *ptr, size_t size);           //改变我们原来申请的空间的大小的

比如申请10个int元素的内容:

malloc(40);           malloc(10*sizeof(int));

calloc(10,4);         calloc(10,sizeof(int));

数组定义时必须同时给出数组元素个数(数组大小),而且一旦定义无法改变。

堆内存申请时必须给定大小,然后一旦申请完成大小不变,如果要变只能通过realloc接口。realloc的实现原理类似于JAVA中可变大小的优势。

数组定义时必须同时给定数组元素个数,而且一旦定义在无法更改。在java等高级语言中有一些语法技巧更改数组大小,但其实这个只是一种障眼法。它的工作原理是:先重新创建一个新的数组大小为要更改后的数组,然后将原数组的所有元素复制进新数组,然后释放掉原数组,最后返回新的数组给用户;

优势:大小灵活

劣势:需要程序员去处理各种细节,容易出错,依赖程序员水平

发布了14 篇原创文章 · 获赞 0 · 访问量 420

猜你喜欢

转载自blog.csdn.net/LIGUOZHENLX/article/details/104124340
今日推荐