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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。