c++程序内存布局,c语言内存结构

  c++程序内存布局,c语言内存结构

  c语言编程-程序的内存布局-GNU不眠之夜-博客公园

  C语言程序设计.程序的存储器布局1:C语言程序的存储区

  c语言代码(文本文件)形成一个可执行程序(二进制文件),需要经历编译、汇编、连接三个阶段。在编译过程中,将C语言文本文件生成汇编器,在汇编过程中,将汇编器形成二进制机器码,在连接过程中,将每个源文件生成的二进制机器码记录组合成一个文件。

  用C语言写的程序会被编译连接成一个统一的文件,这个文件由几个部分组成。当程序运行时,会生成其他几个部分,每个部分代表一个不同的存储区域:

  1.代码段(代码或文本)

  段由程序中执行的机器代码组成。在C语言中,程序语句被编译成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段中的每一个机器码,由处理器依次运行。

  2.只读数据段(RO数据)

  只读数据段是程序使用的一些不会被更改的数据。使用这些数据的方式类似于查表操作。因为这些变量不需要改变,只需要放在只读存储器中。

  3.读写数据段(RW数据)已初始化。

  初始化数据是在程序中声明的有初始值的变量。这些变量需要占用内存空间。当程序执行时,它们需要位于一个可读可写的内存区域,并具有程序运行时读写的初始值。

  4.未初始化的数据段

  未初始化数据是在程序中声明的变量,但没有初始化。这些变量在程序运行前不需要占用内存空间。

  5.许多

  堆内存只在程序运行时出现,一般由程序员分配和释放。对于操作系统,如果程序没有被释放,操作系统可以在程序(如进程)结束后回收内存。

  6.堆

  堆栈内存仅在程序运行时出现。函数内部使用的变量,函数的参数和返回值都会使用堆栈空间,堆栈空间是由编译器自动分配和释放的。

  看一个例子:

  ?int a=0;//全局初始化区域。段数据静态int b=20//全局初始化区域。段数据char * p1//const int A=10在全局未初始化区域的bss段;//rodata段void main(void){ int b;//stack char s[]= ABC ;//stack char * p2;//栈静态int c=0;//全局(静态)初始化区域。数据段char * p3= 123456//123456\0在常量区,p3在堆栈上。P1=(char *)malloc(10);//10和20字节的分配区在堆区p2=(char *)malloc(20);(20);strcpy(p1, 123456 );//123456 \ 0在常量区,编译器可能会优化到与p3指向的‘123456’相同的地方}代码段、只读数据段、读写数据段和未初始化数据段属于静态区,堆和栈属于动态区。链接后会生成代码段、只读数据段和读写数据段,程序初始化时会打开未初始化的数据段,程序运行过程中会分配和释放堆和栈。c语言程序分为两种状态:镜像和运行时。编译-连接后形成的映像将只包含代码段(文本)、只读数据段(RO数据)和读写数据段(RW数据)。程序运行前会动态生成未初始化数据段(BSS),程序运行时也会动态形成堆区和栈区。一般来说,在静态图像文件中,每个部分称为一个节,而运行时的每个部分称为一个段。如果不详细区分,可以统称为段。

  在C语言程序中,使用变量时应注意以下几点:

  1.函数体中定义的变量通常在堆栈上,不需要在程序中管理,由编译器处理。

  2.malloc、calloc、realloc等内存分配函数分配的内存空间都在堆上,程序必须保证用free来释放,否则会发生内存泄漏。

  3.所有函数在体外都定义为全局变量,用static添加的变量无论在函数内部还是外部都放在全局区域。

  4.用const定义的变量将放在程序的只读数据区。

  堆栈空间主要用于存储以下3种数据:

  1.函数内部的动态变量

  2.函数的参数

  3.函数的返回值

  堆栈空间是动态开发和回收的。在函数调用的过程中,如果函数调用的层次多了,所需的堆栈空间就会逐渐增加。对于参数传递和返回值,如果使用更大的结构,使用的堆栈空间也会更大。

  ~ ~技术进步在传播~本博客属于个人学习记录。我想与你分享它。能力有限,如有错误请指正!感激不尽!——GNU夜不成眠~ ~ ~

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: