自上而下:
栈区(Stack):
由编译器自动分配和释放,主要存放函数的局部变量、形参以及调用函数时的返回地址等。当函数被调用时,相关的内存被分配;当函数执行完毕,相应的内存也被自动释放。
堆区(Heap):
一般由程序员通过动态内存分配函数(如malloc或new)手动申请和释放。如果在程序运行期间没有手动释放,那么在程序结束时这部分内存通常会由操作系统回收。未释放的堆内存可能会导致内存泄漏问题。
全局/静态存储区:
存放全局变量和静态变量。其中,初始化的全局变量和静态局部变量放在一块区域,而未初始化的全局变量和未初始化的静态局部变量则放在相邻的另一块区域。这部分内存的生命周期与程序的运行周期一致,直到程序结束才会被系统释放。
文字常量区:
用于存放程序中定义的所有常量值,比如字符串常量。这部分内存是由系统进行管理的,并且其内容为只读。程序结束后,该部分内存会被系统释放。
程序代码区:
存放程序的二进制代码,包括机器指令和相关数据。这部分内存由系统管理,并在程序执行完毕后释放。
细节小知识
使用static关键字修饰的变量被称为静态变量。
在C语言中,static关键字有着重要的用途,它可以用来修饰变量和函数。具体来说,static关键字的作用可以概括为以下几点:
- 延长变量生命周期:当static修饰局部变量时,这些变量的生命周期会从整个程序的运行期间延长至函数调用之间。即使函数执行完毕,这些变量的值也会被保留,直至程序结束。
- 限制变量作用域:被static修饰的变量具有内部链接,这意味着它们只能在定义它们的文件内部可见。这有助于隐藏变量,避免名称冲突,并支持模块化编程。
- 保持变量值不变:如果一个全局变量被static修饰,那么它只在定义它的文件内可见,不同于自动全局变量在整个程序的所有文件中都是可见的。
- 存储位置:静态变量通常存储在全局/静态存储区,而非栈或堆。这意味着它们在程序的生命周期内一直存在,而不是像自动变量那样在调用时就存在,退出函数就消失。
综上所述,static关键字确实用于声明静态变量,并且它还影响着变量的存储、生命周期和可见性。了解这些特性对于编写高效且易于维护的C语言代码至关重要。
被static修饰的函数,也称为静态函数,存在于程序的代码区中。
在C语言中,使用static关键字修饰的函数具有内部链接属性,这意味着它们只能在定义它们的源文件内被调用,对于其他源文件来说是不可见的。这种特性使得静态函数成为特定文件的私有函数,有助于封装实现细节和避免全局命名空间污染。尽管这些函数只在单个文件中可用,但它们在内存中的存储方式与普通函数并无差异。也就是说,不论是静态函数还是非静态函数,它们的代码都放置在程序代码区。
需要注意的是,虽然静态函数的实体位于代码区,但如果在函数内部定义了静态局部变量,则这些变量会存放在静态存储区。
综上所述,无论一个函数是否被static修饰,其代码本身都是存放在程序代码区中的。而涉及到函数内部的变量时,如果变量是静态局部变量,则会存放在静态存储区;如果是自动变量,则会存放在栈区。
你认为还有那些比较重要的?欢迎留言补充和指正!