C语言-学习之路-07

这篇具有很好参考价值的文章主要介绍了C语言-学习之路-07。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内存管理
作用域

C语言中变量的作用域可分为:代码作用域、函数作用域、文件作用域

局部变量

局部变量也叫auto自动变量,一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点:

  • 在一个函数内定义,只在函数范围内有效
  • 在复合语句中定义,只在函数范围内有效
  • 随着函数调用的结束或复合语句的结束局部变量的声明周期也随即结束
  • 如果没有赋初值,内容为随机
静态(static)局部变量
  • static局部变量的作用域也是在定义的函数内有效
  • static局部变量的生命周期和程序运行周期一样,同时static局部变量的值只初始化一次,但可以赋值多次。
  • static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空值。
全局变量
  • 在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明。
  • 全局变量的生命周期和程序运行周期一样。
  • 不同文件的全局变量不可重名。
extern全局变量声明

extern int a; 声明一个变量,这个变量在别的文件中已经定义了,这里只是声明,而不是定义。

全局函数和静态函数

在C语言中,函数都是默认全局的,使用关键字static可以将函数声明为静态,函数定义为static就意味这个函数的文件中使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。
对于不同文件中的static函数名字可以相同。
注意
允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。
同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。
所有的函数默认都是全局的,以为着所有的函数都不能重名,但如果是static函数,那么作用域是文件级的,所以不同的文件static函数名可以是相同的。

类型 作用域 声明周期
auto变量 一对 { }内 当前函数
static局部变量 一对 { }内 整个程序运行期
extern变量 整个程序 整个程序运行期
static全局变量 当前文件 整个程序运行期
extern函数 整个程序 整个程序运行期
static函数 当前文件 整个程序运行期
register变量 一对 { }内 当前函数
内存分布
内存分区

C程序代码经过预处理、编译、汇编、链接4步后生成一个可执行程序。
在Linux下,程序是一个普通的可执行文件。在没有运行程序前,即程序没有加载到内存前,可执行程序内部已经分为3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)。

  • 代码区
    存放CPU执行的机器指令。通常代码区可是共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。
  • 全局初始化数据区/静态数据区(data)段
    该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
  • 未初始化数据区(bss区)
    存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为0或者为空NULL。

程序在加载到内存前,代码区和全局区(data和bss)的大小就是固定的,程序运行期间不能改变。然后,运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区(text)、数据取(data)、和未初始化数据区(bss)之外,还额外增加了栈区、堆区。
C语言-学习之路-07文章来源地址https://www.toymoban.com/news/detail-435974.html

  • 代码区(text segment)
    加载的是可执行文件代码段,所有的可执行代码都加载到代码区,这块内存是不可以在运行期间修改的。
  • 未初始化数据区(BSS)
    加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。
  • 全局初始化区/静态数据区(data segment)
    加载的是可执行文件数据段,存储于数据段(全局初始化,静态初始化数据,文字常量(只读))的数据的生存周期为整个程序运行过程。
  • 栈区(stack)
    栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放。因此,局部变量的生存周期为申请到释放该段栈空间。
  • 堆区(heap)
    堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

到了这里,关于C语言-学习之路-07的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 44-js return返回值,全局作用域,局部作用域,隐式作用域,变量的生命周期,delete释放内存

    44-js return返回值,全局作用域,局部作用域,隐式作用域,变量的生命周期,delete释放内存

    1. return 返回值:函数执行后剩下结果就是返回值。 2.作用域 查找变量的时候,会从当前作用域开始查找,如果当前作用域查找不到,逐层(外层)向上查找 2.1全局作用域 2.2局部作用域 

    2024年02月02日
    浏览(13)
  • Go 语言变量作用域

    作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。 Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函数定义中的变量称为形式参数 接下来让我们具体了解局部变量、全局变量和形式参

    2024年02月09日
    浏览(8)
  • 【C语言趣味教学】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

    【C语言趣味教学】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(9)
  • 【C语言趣味教程】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

    【C语言趣味教程】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(12)
  • 【C++修炼之路】内存管理

    【C++修炼之路】内存管理

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:C++修炼之路

    2024年02月16日
    浏览(9)
  • 第五十三天学习记录:C语言进阶:动态内存管理Ⅰ

    问: 栈区堆区静态区的大小是固定的吗?如果栈区满了,会向后2者借位置吗? ChatAI答: 栈区、堆区和静态区的大小通常是由操作系统或编译器预定义的,不是固定的。这些区域的大小通常受到多种因素的影响,如系统物理内存大小、进程虚拟地址空间的大小、编译器和操作

    2024年02月06日
    浏览(15)
  • 第五十四天学习记录:C语言进阶:动态内存管理Ⅱ

    第五十四天学习记录:C语言进阶:动态内存管理Ⅱ

    1、对NULL指针的解引用操作 2、对动态开辟的内存的越界访问 3、对非动态开辟内存的free 4、使用free释放动态开辟内存的一部分 5、对同一块动态内存多次释放 6、动态开辟内存忘记释放(内存泄漏) 问:realloc的第一个参数的指针地址必须是malloc或calloc创建的在堆上的地址吗?

    2024年02月06日
    浏览(15)
  • C语言变量的作用域,生命周期和链接相关

    本文介绍C语言的三个很重要的概念: 变量的作用域 变量的生命周期 变量或者函数的链接 先介绍一个概念: 翻译单元 C语言中有两种文件, 头文件.h , 代码文件.c 翻译单元指的是 包含头文件,并且将头文件展开以后的代码文件.c ,而每个翻译单元都有一个 文件作用域 ,实

    2024年02月04日
    浏览(10)
  • 【C语言趣味教程】(4) 变量:代码注释 | 变量的声明 | 初始化与赋值 | 作用域与生命周期 | 局部变量与全局变量

    【C语言趣味教程】(4) 变量:代码注释 | 变量的声明 | 初始化与赋值 | 作用域与生命周期 | 局部变量与全局变量

      🔗 《C语言趣味教程》👈 猛戳订阅!!! 0x00 引入:注释的作用 \\\"程序员最讨厌两种人:一种是不写注释的人,一种是让我写注释的人。\\\" 相信大家对注释早已有所耳闻,对于注释,C 语言有两种注释风格,我们下面会逐个讲解。   但在这之前,我们先来了解了解注释的作

    2024年02月15日
    浏览(13)
  • C语言局部变量与栈内存

    C语言局部变量与栈内存

    局部变量概念:凡是被一对花括号包含的变量,称为局部变量 局部变量特点: 某一函数内部的局部变量,存储在该函数特定的栈内存中 局部变量只能在该函数内可见,在该函数外部不可见 当该函数退出后,局部变量所占的内存立即被系统回收,因此局部变量也称为临时变量

    2024年02月19日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包