静态存储区,栈和堆的区别【美高梅游戏网站登

这是原文的链接

C语言编程程序的内存如何布局

在c语言中,每个变量和函数有两个属性:数据类型数据的存储类别
C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)

栈和堆的区别

简单来说,存储类就是C语言中存储变量的地方的类型分为动态存储区,静态存储区

1. 从变量的作用域划分变量(即从空间)角度来分

一、    程序所占内存分类

  • 其增长方向:自顶向下增长
  • 有内存空间的限制
  1. 函数形参,在调用函数时给形参分配空间
  2. 函数内的自动变量
  3. 函数调用时的现场保护和返回地址(即函数调用语句的下一句可执行语句)
  • 在函数调用开始时分配存储空间,函数结束时释放存储空间
  • 函数调用结束时,局部变量先出栈,接着是形参,最后栈指针指向最开始存储的地址来进行下一条指令
1.全局变量

版本一 转于大家论坛

  • 程序员自定义存储空间
  • 使用后,需要手动释放内存,不然会造成内存泄露
2.局部变量

C/C++编译的程序占用的内存分类:
1、栈区(stack)------由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(属于后进先出的方式)。

.data段

  • 存放非零全局变量、静态局部变量

2. 从变量值存在的时间或存储类别(即生存期)角度来分

2、堆区(heap)------ 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

.bss段(Block Started by Symbol)

  • 存放未初始化的全局变量、静态局部变量
  • 运行时,由系统初始化,即清零。一般要自己写
2.1. 静态存储区

存放以下数据: 代码段(text)只读数据段(rodata)读写数据段(rwdata)未初始化数据段(bbs)

静态存储区存放全部的全局变量, 这些变量将在链接之后产生, 程序执行完毕就释放, 程序执行的过程中它们占据固定的存储单元, 而不会动态的进行分配和释放

3、全局、静态存储区(global、static)

.ROData

  • 存放字符串常量
char *p="linux"; // 定义了一个分配在栈上占4字节的指针指向了一个分配在文本常量区上占6字节的字符串
2.2. 动态存储区

存放以下数据: 函数形参自动变量(未加static声明的局部变量)函数调用时的现场保护和返回地址

对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区-----常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区-----存放函数体的二进制代码。

.text段

  • 美高梅游戏网站登录 ,cup执行的机器指令部分(函数体的二进制代码)
  • 属性只读,为了防止程序由于意外事故而修改自身指令

作用域即变量或函数起作用的范围

  • 文件作用域
  • 代码作用域
  • 永久
  • 临时

链接属性有以下3种:

  • 外链接
  • 内链接
  • 无链接

宏定义 和 inline内联函数 链接属性为 无链接

类型 存储类 作用域 生命周期 链接属性
普通全局变量 .data段/.BSS段 文件作用域 永久 外链接
静态全局变量 .data段/.BSS段 文件作用域 永久 内链接
普通局部变量 代码作用域 临时 无链接
静态局部变量 .data段/.BSS段 代码作用域 永久 无链接
普通函数 .text段 文件作用域 永久 外链接
静态函数 .text段 文件作用域 永久 内链接
类型 Stack Heap
生长方向 向地址减小的方向增长 向地址增大的方向增长
分配方式 动态分配与静态分配 动态分配
碎片问题 无此问题 过多使用会造成内存不足
申请后系统响应 无可用空间报异常提示栈溢出 系统分配申请的内存到空闲地址链表中
分配效率 相对高 相对低
申请大小 系统预先规定好大小 系统可用内存
申请效率 相对快 相对慢,容易产生内容碎片
存储内容 看上面 一般在堆的头部用1字节存放堆的大小,其他程序员安排
存取效率 相对快,char s[]="Hello";在运行时赋值;数组比指针要快一些 相对慢;char *s="Hello";在编译时确定

最后附上一张内存分布的图片

美高梅游戏网站登录 1内存分布.png

:本文内容部分来自互联网整理,部分来自个人经验总结;本文将持续收集更新,欢迎留言补充!

3. 从用户内存空间角度分为三个部分

 

1. 程序区
一行一行的等待执行的机器码 

程序区

2. 静态存储区

美高梅棋牌官网 ,静态存储区

3. 动态存储区

动态存储(stack)

4. 从C程序运行时又可分为以下存储区

版本二参考《C语言程序设计》(中国矿大出版社)

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:静态存储区,栈和堆的区别【美高梅游戏网站登

您可能还会对下面的文章感兴趣: