指针与内存分配 1.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
指针与内存分配 1

指针和内存分配 1 C语言的强大功能之一是可以灵活地定义数据的存储方式。C语言从 两个方面控制变量的性质:作用域(scope)和生存期(lifetime)。 作用域是指可以存取变量的代码范围,生存期是指可以存取变量的 时间范围。 作用域有三种: 1.extern(外部的)这是在函数外部定义的变量的缺省存储 方式。extern变量的作用域是整个程序。 2.static(静态的)在函数外部说明为static的变量的作用 域为从定义点到该文件尾部;在函数内部说明为static的变量的作 用域为从定义点到该局部程序块尾部。 3.auto(自动的)这是在函数内部说明的变量的缺省存储方 式。auto变量的作用域为从定义点到该局部程序块尾部。 变量的生存期也有三种,但它们不象作用域那样有预定义的关 键字名称。第一种是extern和static变量的生存期,它从main()函 数被调用之前开始,到程序退出时为止。第二种是函数参数和auto 变量的生存期,它从函数调用时开始,到函数返回时为止。第三种 是动态分配的数据的生存期,它从程序调用malloc()或calloc()为 数据分配存储空间时开始,到程序调用free()或程序退出时为止。 2.1变量存储在内存(memory)中的什么地方? 变量可以存储在内存中的不同地方,这依赖于它们的生存期。 在函数外部定义的变量(全局变量或静态外部变量)和在函数内部定 义的static变量,其生存期就是程序运行的全过程,这些变量被存 储在数据段(datasegment)中。数据段是在内存中为这些变量留出 的一段大小固定的空间,它分为两部分,一部分用来存放初始化变 量,另一部分用来存放未初始化变量。 在函数内部定义的auto变量(没有用关键字static定义的变量) 的生存期从程序开始执行其所在的程序块代码时开始,到程序离开 该程序块时为止。作为函数参数的变量只在调用该函数期间存在。 这些变量被存储在栈(stack)中。栈是内存中的一段空间,开始很 小,以后逐渐自动增大,直到达到某个预定义的界限。在象DOS这 样的没有虚拟内存(virtual memory)的系统中,这个界限由系统决 定,并且通常非常大,因此程序员不必担心用尽栈空间。关于虚拟 内存的讨论,请参见2.3。 第三种(也是最后一种)内存空间实际上并不存储变量,但是可 以用来存储变量所指向的数据。如果把调用malloc()函数的结果赋 给一个指针变量,那么这个指针变量将包含一块动态分配的内存的 地址,这块内存位于一段名为堆(heap)的内存空间中。堆开始 时也很小,但当程序员调用malloc()或calloc()等内存分配函数时 它就会增大。堆可以和数据段或栈共用一个内存段(memorysegment ),也可以有它自己的内存段,这完全取决于编译选项和操作系统 。 与栈相似,堆也有一个增长界限,并且决定这个界限的规则与栈 相同。 请参见: 1.1什么是局部程序块(10calblock)? 2.2变量必须初始化吗? 2.3什么是页抖动(pagethrashing)? 7.20什么是栈(stack)? 7.21什么是堆(heap)7. 2.2变量必须初始化吗? 不。使用变量之前应该给变量一个值,一个好的编译程序将帮 助你发现那些还没有被给定一个值就被使用的变量。不过,变量不 一定需要初始化。在函数外部定义的变量或者在函数内部用static 关键字定义的变量(被定义在数据段中的那些变量,见2.1)在没有 明确地被程序初始化之前都已被系统初始化为0了。在函数内部或 程序块内部定义的不带static关键字的变量都是自动变量,如果你 没有明确地初始化这些变量,它们就会具有未定义值。如果你没有 初始化一个自动变量,在使用它之前你就必须保证先给它赋值。 调用malloc()函数从堆中分配到的空间也包含未定义的数据, 因此在使用它之前必须先进行初始化,但调用calloc()函数分配到 的空间在分配时就已经被初始化为0了。 请参见: 1.1什么是局部程序块(10calblock)? 7.20什么是栈(stack)? 7.21什么是堆(heap)? 2.3什么是页抖动(pagethrashing)? 有些操作系统(如UNIX和增强模式下的Windows)使用虚拟内存 ,这是一种使机器的作业地址空间大于实际内存的技术,它是通过 用磁盘空间模拟RAM(random-access memory)来实现的。 在80386和更高级的Intel CPU芯片中,在现有的大多数其它微 处理器(如Motorola 68030,sparc和Power PC)中,都有一个被称 为内存管理单元(Memory Management Unit,缩写为MMU)的器件。MMU把内存看作是由一系列页(pa

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档