搜索

C语言中有无堆的概念?

gecimao 发表于 2019-07-22 13:50 | 查看: | 回复:

  我知道C++中有栈、堆、静态区、代码区的概念,但是似乎C标准中貌似没有堆的概念。好像所有的动态存储都是在栈中进行的,我们知道堆中的空间需要显式利用delete调用对象析构才能释放(Ja...

  我知道C++中有栈、堆、静态区、代码区的概念,但是似乎C标准中貌似没有堆的概念。好像所有的动态存储都是在栈中进行的,我们知道堆中的空间需要显式利用delete调用对象析构才能释放(Java例外),而C中没有堆的概念,所有的动态数据全部在栈中进行处理,一旦函数调用结束,所有对象的分配的栈空间全部被回收。

  我现在说的是C不是C++,只有C++中才有new 调用构造创建对象的说法,C中只有malloc、calloc创建分配动态存储单元,free用于释放二者分配的存储单元,现在我只想搞清楚一个问题:那就是在函数中采用malloc或calloc分配的动态存储单元在函数调用完成之后会不会被自动释放(还是必须要free之后才释放)?????展开我来答

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  知道合伙人数码行家采纳数:33560获赞数:63354学的虽是计算机网络,但是读的书很多也很杂也是一知半解,所以到现在我也不知道我有啥能力!只知道努力!向TA提问展开全部从不同的角度来理解堆,有不同的含义。 内存可以简单的概括为三个层次:

  1、C语言中的层次,即内存分为静态数据区、栈区、堆区。此时的基本单位是字节。

  2、操作系统中的层次,即虚拟内存。此时的基本单位是块,比如Win32上是以4KB的页文件来管理虚拟内存。

  3、硬件层次,即寻址电路、记忆电路。此时的基本单位是位,然后通过模块化集成为字节、再模块化字节更大的存储单元 。

  不同的层次,堆的概念是不一样的,比如在层次1中,堆往往指的是malloc用户自定义分配的内存,从层次2上看,是有操作系统管理的一块虚拟内存,一般以堆块来进行管理,每个堆块有一个属性段,描述段是正使用、保留、还是已回收。 从层次3,则没有任何堆、栈的概念。

  展开全部栈,堆,静态区,是内存开辟的三个专属区,C语言的内存分配也就只有这三种方式

  如函数里定义的变量int i; char str[80],还有保存函数的所有信息的内存都是在栈上创建的

  这块内存是连续的,就好比是一个数组,所以你在内存分配的时候,会发现变量地址是连续的

  这块内存是有很多内存块组成,很像鞭炮一样串在一根绳子上,但这些内存块的大小不一样,存储在链表结构中的结点中,当你用malloc动态申请是,编译器会根据你内存块的大小从表头一次检索,直到链表中的内存块大于等于你所申请的内存大小时,返回该快内存,如果链表上的内存块大于你所申请的内存时,会将多余内存回收到链表结构,这也就是为什么动态申请内存容易造成内存碎片的产生原因。所以分配内存时你会发现他们的地址不连续

  这块内存也是连续的,也像一个数组,但它跟栈上创建内存唯一的区别是,内存作用时间不一样,静区内存作用时间是整个“程序”运行时间,栈上内存作用时间是整个“函数”的运行时间,注意“程序”和“函数”的区别

  而堆内存作用时间范围是0到整个“程序”运行时间,如果你要在小于整个“程序”运行时间内释放这块内存的话,就要使用free,所以是手动申请手动释放,你自己可以控制,但是写代码的好习惯习惯是程序中有几个malloc就有几个free,这样可以防止内存泄露

  代码段指的是代码段寄存器,你写的代码存放在这个寄存器里,等待CPU调用,这个属于微机原理所讨论问题,有兴趣可以学学

  展开全部我们经常在题目中有要求,输入一个整数,然后以这个整数作为数组的元素个数,下面的程序代码是错误的。

  堆是一种动态存储结构,实际上就是数据段中的自由存储区,它是C语言中使用的一种名称,常常用于动态数据的存储分配。堆中存入一数据,总是以2字节的整数倍进行分配,地址向增加方向变动。堆可以不断进行分配直到没有堆空间为止,也可以随时进行释放、再分配,不存在次序问题。

  所谓动态数组是指在程序运行期间确定其大小的,如常用到的动态数组,它们是在程序执行过程中动态进行变化的,即在程序开始部分没有说明大小,只有在程序运行期间用堆的分配函数为其分配存储空间,分配的大小可根据需要而定,这些数据使用过后,可释放它们占用的堆空间,并可进行再分配。

  堆和栈在使用时相向生长,栈向上生长,即向小地址方向生长,而堆向下增长,即向大地址方向,其间剩余部分是自由空间。使用过程中要防止增长过度而导致覆盖。

  void malloc (unsigned size); 该函数将分配一个大小为size字节的堆空间,并返回一个指向这个空间的指针。由于这个指针是void型的,因此当将它赋给其他类型的指针时,必须对该指针进行强制类型转换。例如info是一个结构类型指针,即:

  void calloc(unsigned n,unsigned size); 该函数将分配一个容量为n*size大小的堆空间,并用0初始化分配的空间。该函数将返回一个指向分配空间的指针,没有空间可用时,则返回一个NULL指针。

  程序分配100字节的堆空间,转换成int型赋给pi,当pi为NULL时,表示没有可用的空间了,则显示allocation failure。输入一个整数,压入栈中,当超过50时,则显示stack overflow.当输入0时,则把栈中的数据弹出。这个程序也演示了栈的后进先出的特点。

  形象的说:将若干个数据项按一定的原则前后链接起来,没有数据项都有一个指向下一个数据的指针,则这些数据项靠指针链成一个表,最后的一个数据没有指针(指针为NULL),这就是链表。可以看出链表放在存储器中,并不一定象数组一样,连续存放,也可以分开存放。由于链的各节点均带有指向下一个节点的地址,因而要找到某个节点,必须要找到上一个节点,如此类推,则可由第一个节点出发找到目的点。链表在数据库建立和管理中用得比较普遍。

  链表中的每个节点都具有相同的结构类型,它们是由两部分组成,即数据部分(它们包含一些有用的信息),另一部分就是链的指针。下面就定义一个通信链节点的数据结构:

  该结构中前五个成员是该节点的信息部分,最后一个成员是指向同一个结构类型的指针。即next又指向一个同样结构类型的节点。

  建立链表时,首先要将第一个节点的内容存入堆中,为此要将堆中能存入该节点内容的内存区域首地址赋给一个指针。我们可以用malloc()函数来分配内存区域。如info是一个指针:

  info=(struct address *)malloc(sizeof(list_entry)); 当第一个节点存入有info指出的内存区后,再执行该函数,便得到狭义个节点的存储地址info,此时将该info赋给上一个节点的next,并将该节点内容存入info指出的内存区,这样两个节点就链接起来了。此过程反复多次,就可不断的将节点加入链表的尾端。

  dls_store()函数是将输入的节点地址写到上一个节点的next指针项。其中定义的结构指针last是一个静态变量,初始值为NULL,这意味着在编译时将为该变量分配一个固定的存储空间以存放其值。因初始值为NULL,这样在第一次调用该函数时,由于它代表一个空指针,因而把由malloc()分配的第一个节点地址赋给它,使last指向该节点,第二次调用时,静态变量last已指向第一个节点地址。如此反复调用,便建立起了n次调用产生的

  这种情况我们的处理方法是:把该数据作为第一项,指针指向原先的首项即可。设原先首项为top,待插入的数据为in,则:

  例如想删除in这个数据,它原先的前面是old,后面是top,即原先的链表是这样:

  链表问题比较复杂,但又是很重要的概念。上面说的输入,查找,删除,插入等功能一定要理解,可以参考别的一些资料看看。

  上面说的单链表,但是单链表有一个缺点,就是无法反向操作,当某一个链因破坏而断裂,则整个链就被破坏而无法恢复。双链表可以弥补这个缺点,所谓双链表是指每个节点有两个指针项,一个指针指向其前面的节点,而另一个指针指向后面的节点。关于双链表的使用相对要复杂一些,这里就不介绍了,可以找其他一些资料看看。

  展开全部我现在说的是C不是C++,只有C++中才有new 调用构造创建对象的说法,C中只有malloc、calloc创建分配动态存储单元,free用于释放二者分配的存储单元,现在我只想搞清楚一个问题:那就是在函数中采用malloc或calloc分配的动态存储单元在函数调用完成之后会不会被自动释放(还是必须要free之后才释放)?????

  就是c,有堆得概念,所谓的动态存储单元都是在堆区,当然需要free释放掉,严谨的程序是要手动释放的,当然你要是忘记free了,操作系统会有释放机制,其实是操作系统帮你完成,而不是所谓的能够自动释放。

  展开全部必须有,一个简单的道理。C语言能干n多事呢!操作系统大部分底层都是用C来实现的。

  C++说白点,就是C的衍生,一些基本的栈、堆、静态区、代码区的概念,C里面也有,只是见到的不多。楼上提到数据结构就是会用到栈堆的概念。

本文链接:http://hem-larm.com/dongtaicunchuguanli/1052.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部