C语言内存分布之数据段详解.pdfVIP

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

在线学习好工作 / C 语言内存分布之数据段详解 不管我们以后是自己写代码还是读别人的代码,都应该想想这个变量默认存 储的位置。在我们以后的嵌入式开发中,技巧性的代码越来越多的时候,我们可 能把某一些代码放在一段。我们可以通过修改变量或者代码默认放置的段,让它 被放到其它的段中。我们也可以自己定义一个新的段。 随着运行,栈空间是随时会变化的。栈空间临时的去存储一些变量,当我们 进入一个函数,系统就会在栈空间去分配一片内存去保存这个函数里面所有的变 量。当函数执行完之后,这一片内存的数据就被销毁了。当我们在初学的时候, 就千万不要犯把局部变量给别人的错误。 全局的数据空间和只读数据段,代码段都是在运行之前就已经分配好了的。 所以我们在打印信息的时候应该尽量不要使用太多的字符串,否则容易导致程序 的可执行文件很大。所以我们在最后发布程序的release 版本里面去除了我们一 些调试用的信息。 测试代码如下 我们在main 函数外面申请了一个全局变量b,但是我们并没有为这个b 赋 初始值。它仅仅只是为这个变量圈出了一块内存,里面有为全局变量自动初始化 的0 值。 运行结果如下 上面的结果是没有变量b 的结果,下面是添加全局变量b 的结果。bss 段就 是未初始化的全局变量存储的段,上面的全局变量b 就在这个段中分配了四个字 节(尽管系统已经将它初始化为0 ,但是并不是我们初始化的)。 测试代码如下 我们只是将未初始化的变量b 将它初始化了。 运行结果如下 可以看到,在未初始化的字段里面少了四个字节,而在已初始化的字段里面 多了四个字节。所以我们也将date 称做全局初始化数据空间,bss 称做全局未初 始化数据空间。局部的变量不管有没有初始化都是存储在栈上。 Static 关键字声明变量的时候,系统就会将它认为是一个全局变量,即使它 在函数内部声明。此时,它分配的地址也就在全局的数据空间。 测试代码如下 运行结果如下 这就是声明变量a 为静态数据前后的结果,此时分配的段为全局未初始化数 据空间,现在它不在栈中,那么就不会随着栈的弹出而被销毁了。静态数据段的 消失是在整个程序都消失之后才会消失。 测试代码如下 我们在两个函数里面声明了两个一样的变量a,虽然它们是一样的名字,但 是它们在系统中的访问却是不一样的,fun 函数里面的a++调用的是该函数里面 的。Main 函数也是对应的。 运行结果如下 这是添加一个fun 函数前后的结果,编译器并没有对两个全局变量报错,它 将fun 函数里面的静态变量a 放到了data 段中。虽然它们是一样的变量名,但 是在编译器中,它们有不一样的后缀。 我们可以通过nm build 查看静态的数据段,前面为地址,两个变量的后缀是 不一样的。 Static 相当于全局的数据空间的一个显示分配的符号,它可以更改局部数据 的默认存储段,虽然它们的访问依然是局部的,但是存储位置已经在全局数据段 中了。 文章来源:麦子学院 原文链接:/wiki/c/memory/

文档评论(0)

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

教师资格证持证人

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

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档