• 注册
  • 关于作者
    企业认证:趣记站长
    关注 6 粉丝 4 喜欢 9 内容 992
    江西省·南昌市
    聊天 送礼
    • 查看作者
    • C言语编程递次的内存如何构造

      重点存眷以下内容:

        C言语递次在内存中各个段的组成

        C言语递次连接历程傍边的特性和有数缺点

        C言语递次的运转体式款式

        一:C言语递次的存储区域

        由C言语代码(文本文件)组成可执行递次(二进制文件),需要经过编译-汇编-连接三个阶段。编译历程把C言语文本文件生成汇编递次,汇编历程把汇编递次组成二进制机器代码,连接历程则将各个源文件生成的二进制机器代码文件组合成一个文件。

        C言语编写的递次经过编译-连接后,将组成一个一致文件,它由几个局部组成。在递次运转时又会发生发火生气希望生气希望希望生气希望希望希望生气希望希望希望希望其他几个局部,各个局部代表了不合的存储区域:

        1.代码段(Code或Text)

        代码段由递次中执行的机器代码组成。在C言语中,递次语句举办编译后,组成机器代码。在执行递次的历程傍边,CPU的递次计数器指向代码段的每一条机器代码,并由措置惩罚器依次运转。

        2.只读数据段(RO data)

        只读数据段是递次运用的一些不会被更改的数据,运用这些数据的体式款式类似查表式的安排,由于这些变量不需要更改,因此只需要安排在只读存储器中即可。

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

        已初始化数据是在递次中声明,并且具有初值的变量,这些变量需要占用存储器的空间,在递次执行时它们需要位于可读写的内存区域内,并具有初值,以供递次运转时读写。

        4.未初始化数据段(BSS)

        未初始化数据是在递次中声明,但是没有初始化的变量,这些变量在递次运转之前不需要占用存储器的空间。

        5.堆(heap)

        堆内存只在递次运转时出现,一样平常由递次员分配和释放。在具有安排系统的情况下,如果递次没有释放,安排系统可以或许或许或许或许或许在递次(歧一个历程)完毕后收受吸收内存。

        6.栈(stack)

        栈内存只在递次运转时出现,在函数内部运用的变量、函数的参数和返回值将运用栈空间,栈空间由编译器自动分配和释放。

        C言语目标文件的内存组织

        看一个例子:

        int a = 0; //全局初始化区,。data段

        static int b=20; //全局初始化区,。data段

        char *p1; //全局未初始化区 .bss段

        const int A = 10; //.rodata段

        void main(void)

        {

        int b; //栈

        char s[] = "abc"; //栈

        char *p2; //栈

        static int c = 0; //全局(静态)初始化区 .data段

        char *p3 = "123456"; //123456\0在常量区,p3 在栈上。

        p1 = (char*) malloc(10);//分配得来的10和20个字节的区域就在堆区

        p2 = (char*) malloc(20);

        strcpy(p1, "123456"); //123456\0 在常量区,编译器可以或许或许或许或许或许会将它与p3所指向的"123456"优化成一个地方

        }

        代码段、只读数据段、读写数据段、未初始化数据段属于静态区域,而堆和栈属于动态区域。代码段、只读数据段和读写数据段将在链接今后发生发火生气希望生气希望希望生气希望希望希望生气希望希望希望希望,未初始化数据段将在递次初始化的时候拓荒,而堆和栈将在递次的运转中分配和释放。C言语递次分为映像和运转时两种状态。在编译-连接后组成的映像中,将只收罗代码段(Text)、只读数据段(RO Data)和读写数据段(RW Data)。在递次运转之前,将动态生成未初始化数据段(BSS),在递次的运转时还将动态组成堆(Heap)区域和栈(Stack)区域。一样平常来讲,在静态的映像文件中,各个局部称之为节(Section),而在运转时的各个局部称之为段(Segment)。如果不细致辨别,可以或许或许或许或许或许统称为段。

        知识点:

        C言语在编译和连接后,将生成代码段(Text)、只读数据段(RO Data)和读写数据段(RW Data)。在运转时,除以上三个区域外,还收罗未初始化数据段(BSS)区域和堆(Heap)区域和栈(Stack)区域。

        二:C言语递次的段

        1.代码段(code或text)

        代码段由各个函数发生发火生气希望生气希望希望生气希望希望希望生气希望希望希望希望,函数的每一个语句将究竟经过编绎和汇编生成二进制机器代码(细致生生哪种系统组织的机器代码由编译器决定)。

        2.只读数据段(RO Data)

        只读数据段由递次中所运用的数据发生发火生气希望生气希望希望生气希望希望希望生气希望希望希望希望,该局部数据的特性是在运转中不需要改变,因此编译器会将该数据段放入只读的局部中。C言语中的只读全局变量,只读局部变量,递次中运用的常量等会在编译时被放入到只读数据区。

        注意:定义全局变量const char a[100]={"ABCDEFG"};将生成大小为100个字节的只读数据区,并运用“ABCDEFG”初始化。如果定义为:const char a[ ]={"ABCDEFG"};则根据字符串长度生成8个字节的只读数据段(尚有’\0’),所以在只读数据段中,一样平常都需要做完全的初始化。

        3.读写数据段(RW Data)

        读写数据段泄漏展现了在目标文件中一局部可以或许或许或许或许或许读也可以或许或许或许或许或许写的数据区,在某些场合它们又被称为已初始化数据段,这局部数据段和代码段,

      PHP开发者常犯的10个MySQL缺点
      PHP开发者常犯的10个MySQL错误,用PHP的PEAR DB模块编写数据库脚本,正确理解PHP程序编译时的错误信息,PHP不实用大型系统的九大原因,动态网页制作PHP常用的正则表达式,PHP程序如何调用功能强大的JAVA类库,用Php模拟asp.net的页面模型,解析PHP向MySQL发送数据,PHP+MYSQL实例:网站在线人数的代码,利用PHP的OOP特性实现数据保护,在php中使用sockets:从新闻组中获取文章,用php或js获取图片大小,高宽尺寸,PHP实例:实现给上传图片加水印图案,PHP中for循环语句的几种"变态"用法,用PHP自动把纯文本转换成Web页面,构建可配置PHP应用程序的正确方式,静态/动态编译在Apache+Php+Mysql的应用,基于PHP和AJAX创建RSS聚合器,实用技巧:将PHP作为Shell脚本语言使用,用PHP实现windows资源管理器风格的树型菜单
      PHP

      Linux系统中关于文件编码和编码的转换
      在Linux下无邪运用expect脚本的小窍门,熟知Linux操纵系统紧急情况措置惩罚方法,Linux情况下入侵器械Knark的理会及防范,Linux Shell学习:uniq敕令运用方法引见,Linux下的“暴破”软件,Linux下的18个Windows运用代用品,在Linux系统下如何增添一个新的系统用户,Linux-Wine上运转MS Office2007教程,Linux下经过历程GPRS模块拨号上网的方法,静态库和动态库 Linux系统递次设想之路,Linux中Mysql装配备份与密码规复,在Linux系统上用Qpopper直立POP3服务器,Linux操纵系统下俭朴的系统文件校验方法,制作运转在内存中的Linux系统,处置惩罚Linux系统下Twiki权限设置相干问题,Linux系统中关于文件编码和编码的转换,Linux系统下如何运用rsync举办数据同步,linux apache目录增添密码,Firefox在Linux系统设置装备摆设文件夹的默许门路 ,关于Linux为什么最多能分4个扇区的解释
      Linux文章

      在Linux下无邪运用expect脚本的小窍门
      在Linux下无邪运用expect脚本的小窍门,熟知Linux安排系统紧急情况措置惩罚方法,Linux情况下入侵器械Knark的理会及防范,Linux Shell学习:uniq敕令运用方法引见,Linux下的“暴破”软件,Linux下的18个Windows运用代用品,在Linux系统下如何增添一个新的系统用户,Linux-Wine上运转MS Office2007教程,Linux下经过历程GPRS模块拨号上网的方法,静态库和动态库 Linux系统递次设想之路,Linux中Mysql装配备份与密码规复,在Linux系统上用Qpopper直立POP3服务器,Linux安排系统下质朴的系统文件校验方法,制作运转在内存中的Linux系统,措置惩罚Linux系统下Twiki权限设置相干问题,Linux系统中关于文件编码和编码的转换,Linux系统下如何运用rsync举办数据同步,linux apache目录增添密码,Firefox在Linux系统设置装备摆设文件夹的默许门路 ,关于Linux为什么最多能分4个扇区的解释
      Linux文章

      PHP开发者常犯的10个MySQL缺点
      PHP开发者常犯的10个MySQL缺点,用PHP的PEAR DB模块编写数据库脚本,正确邃晓PHP递次编译时的缺点信息,PHP不实用大型系统的九大启事,动态网页制作PHP常常运用的正则表达式,PHP递次如何调用功能强大的JAVA类库,用Php模拟asp.net的页面模型,理会PHP向MySQL发送数据,PHP+MYSQL实例:网站在线人数的代码,运用PHP的OOP特性完成数据珍重,在php中运用sockets:从新闻组中猎取文章,用php或js猎取图片大小,高宽尺寸,PHP实例:完成给上传图片加水印图案,PHP中for循环语句的几种"失常"用法,用PHP自动把纯文本转换成Web页面,构建可设置装备摆设PHP运用递次的正确体式款式,静态/动态编译在Apache+Php+Mysql的运用,基于PHP和AJAX直立RSS聚合器,实用技巧:将PHP作为Shell脚本言语运用,用PHP完成windows资本管理器风格的树型菜单
      PHP

      在Linux下无邪运用expect脚本的小窍门
      在Linux下无邪运用expect脚本的小窍门,熟知Linux安排系统紧急情况措置惩罚方法,Linux情况下入侵器械Knark的理会及防范,Linux Shell学习:uniq敕令运用方法引见,Linux下的“暴破”软件,Linux下的18个Windows运用代用品,在Linux系统下如何增添一个新的系统用户,Linux-Wine上运转MS Office2007教程,Linux下经过历程GPRS模块拨号上网的方法,静态库和动态库 Linux系统递次设想之路,Linux中Mysql装配备份与密码规复,在Linux系统上用Qpopper直立POP3服务器,Linux安排系统下质朴的系统文件校验方法,制作运转在内存中的Linux系统,措置惩罚Linux系统下Twiki权限设置相干问题,Linux系统中关于文件编码和编码的转换,Linux系统下如何运用rsync举办数据同步,linux apache目录增添密码,Firefox在Linux系统设置装备摆设文件夹的默许门路 ,关于Linux为什么最多能分4个扇区的解释
      Linux文章

      与只读数据段一样都属于递次中的静态区域,但具有可写性的特性。一样平常已初始化的全局变量和局部静态变量被放在了读写数据段,如: 在函数中定义static char b[ 100]={“ABCDEFG”};读写数据区的特性是必须在递次经过初始化,如果只定义,没初始值,则不会生成读写数据区,而会定位为未初始化数据区(BSS)。如果全局变量(函数外部定义的变量)加入static修饰,这泄漏展现只能在文件内运用,而不克不及被其他文件运用。

        4. 未初始化数据段(BSS)

        与读写数据段类似,它也属于静态数据区,但是该段中的数据没有经过初始化。因此它只会在目标文件中被标识,而不会真正称为目标文件中的一段,该段将会在运转时发生发火生气希望生气希望希望生气希望希望希望生气希望希望希望希望。未初始化数据段只在运转的初始化阶段才会发生发火生气希望生气希望希望生气希望希望希望生气希望希望希望希望,因此它的大小不会影响目标文件的大小。

        在C言语的递次中,对变量的运用尚有以下几点需要注意:

        1.函数体中定义的变量一样平常是在栈上,不需要在递次中举办管理,由编绎器措置惩罚。

        2.用malloc,calloc,realloc等分配内存的函数所分配的内存空间在堆上,递次必须担保在运用free释放,否则会发生发火生气希望生气希望希望生气希望希望希望生气希望希望希望希望内存泄漏。

        3.统统函数体外定义的是全局变量,加了static后的变量岂论是在函数内部或外部都放在全局区。

        4.运用const定义的变量将放于递次的只读数据区。

        三:递次中段的运用

        下面用一个质朴的例子来说明C言语中变量和段的对应相干。C言语递次中的全局区(静态区),实际对应着下述几个段:RO Data; RW Data ; BSS Data.

        一样平常来讲,直接定义的全局变量在未初始化数据区,如果该变量有初始化则是在已初始化数据区(RW Data),加上const则将放在只读数据区。

        const char ro[ ] = {"this is read only data"}; //只读数据区

        static char rw_1[ ] ={"this is global read write data"}; //已初始化读写数据段

        char BSS_1[ 100]; //未初始化数据段

        const char *ptrconst ="constant data"; //字符串放在只读取数据段

        int main()

        {

        short b; //在栈上,占用2个字节

        char a[100]; //在栈上拓荒100个字节, 它的值是其首所在

        char s[ ]="abcdefg"; //s在栈上,占用4个字节,"abcdefg"本身安排在只读数据存储区,占8个字节

        char *p1; //p1在栈上,占用4个字节

        char *p2="123456"; //p2 在栈上,p2指向的内容不克不及改,“123456”在只读数据区

        static char rw_2[ ]={"this is local read write data"};//局部已初始化读写数据段

        static char BSS_2[100]; //局部未初始化数据段

        static int c = 0; //全局(静态)初始化区

        p1=(char *)malloc(10 * sizeof(char ) ); //分配内存区域在堆区

        strcpy(p1,"xxxx"); //“XXXX”放在只读数据区,占5个字节

        free(p1); //运用free释放p1所指向的内存

        return 0;

        }

        读写数据段收罗了忆初始化的全局变量 static char rw_1[ ]和局部静态变量static rw_2[ ].其差别在于编绎时,是在函数内部运用的还是可以或许或许或许或许或许在悉数文件中运用。关于rw_1[] 岂论有无static 修饰,其都将被安排在读写数据区,只是能否被其他文件援引与否。关于后者就不一样了,它是局部静态变量,安排在读写数据区,如果没static修饰,其意义完全改变,它将会是拓荒在栈空间的局部变量,而不是静态变量,在这里rw_1[],rw_2[]后没细致数值,泄漏展现静态区大小同后头字符串长度决定。

        关于未初始化数据区BSS_1[100]与BSS_2[100],其辨别在于前者是全局变量,在统统文件中都可以或许或许或许或许或许运用;后者是局部变量,只在函数内部运用。未初始化数据段不设置后头的初始化数值,因此必须运用数值指定区域的大小,编绎器将根据大小设置BSS中需要增添的长度。

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

        1.函数内部的动态变量

        2.函数的参数

        3.函数的返回值

        栈空间是动态拓荒与收受吸收的。在函数调用历程傍边,如果函数调用的层次比较多,所需要的栈空间也逐渐加大,关于参数的转达和返回值,如果运用较大的组织体,在运用的栈空间也会比较大。

      在Linux下无邪运用expect脚本的小窍门
      在Linux下无邪运用expect脚本的小窍门,熟知Linux安排系统紧急情况措置惩罚方法,Linux情况下入侵器械Knark的理会及防范,Linux Shell学习:uniq敕令运用方法引见,Linux下的“暴破”软件,Linux下的18个Windows运用代用品,在Linux系统下如何增添一个新的系统用户,Linux-Wine上运转MS Office2007教程,Linux下经过历程GPRS模块拨号上网的方法,静态库和动态库 Linux系统递次设想之路,Linux中Mysql装配备份与密码规复,在Linux系统上用Qpopper直立POP3服务器,Linux安排系统下质朴的系统文件校验方法,制作运转在内存中的Linux系统,措置惩罚Linux系统下Twiki权限设置相干问题,Linux系统中关于文件编码和编码的转换,Linux系统下如何运用rsync举办数据同步,linux apache目录增添密码,Firefox在Linux系统设置装备摆设文件夹的默许门路 ,关于Linux为什么最多能分4个扇区的解释
      Linux文章

      PHP开发者常犯的10个MySQL缺点
      PHP开发者常犯的10个MySQL缺点,用PHP的PEAR DB模块编写数据库脚本,正确邃晓PHP递次编译时的缺点信息,PHP不实用大型系统的九大启事,动态网页制作PHP常常运用的正则表达式,PHP递次如何调用功能强大的JAVA类库,用Php模拟asp.net的页面模型,理会PHP向MySQL发送数据,PHP+MYSQL实例:网站在线人数的代码,运用PHP的OOP特性完成数据珍重,在php中运用sockets:从新闻组中猎取文章,用php或js猎取图片大小,高宽尺寸,PHP实例:完成给上传图片加水印图案,PHP中for循环语句的几种"失常"用法,用PHP自动把纯文本转换成Web页面,构建可设置装备摆设PHP运用递次的正确体式款式,静态/动态编译在Apache+Php+Mysql的运用,基于PHP和AJAX直立RSS聚合器,实用技巧:将PHP作为Shell脚本言语运用,用PHP完成windows资本管理器风格的树型菜单
      PHP

      在Linux下无邪运用expect脚本的小窍门
      在Linux下无邪运用expect脚本的小窍门,熟知Linux安排系统紧急情况措置惩罚方法,Linux情况下入侵器械Knark的理会及防范,Linux Shell学习:uniq敕令运用方法引见,Linux下的“暴破”软件,Linux下的18个Windows运用代用品,在Linux系统下如何增添一个新的系统用户,Linux-Wine上运转MS Office2007教程,Linux下经过历程GPRS模块拨号上网的方法,静态库和动态库 Linux系统递次设想之路,Linux中Mysql装配备份与密码规复,在Linux系统上用Qpopper直立POP3服务器,Linux安排系统下质朴的系统文件校验方法,制作运转在内存中的Linux系统,措置惩罚Linux系统下Twiki权限设置相干问题,Linux系统中关于文件编码和编码的转换,Linux系统下如何运用rsync举办数据同步,linux apache目录增添密码,Firefox在Linux系统设置装备摆设文件夹的默许门路 ,关于Linux为什么最多能分4个扇区的解释
      Linux文章

      PHP开发者常犯的10个MySQL缺点
      PHP开发者常犯的10个MySQL缺点,用PHP的PEAR DB模块编写数据库脚本,正确明白PHP递次编译时的缺点信息,PHP不实用大型系统的九大启事,动态网页制作PHP常常运用的正则表达式,PHP递次如何调用功能强大的JAVA类库,用Php模拟asp.net的页面模型,理会PHP向MySQL发送数据,PHP+MYSQL实例:网站在线人数的代码,运用PHP的OOP特性完成数据珍重,在php中运用sockets:从新闻组中猎取文章,用php或js猎取图片大小,高宽尺寸,PHP实例:完成给上传图片加水印图案,PHP中for循环语句的几种"失常"用法,用PHP自动把纯文本转换成Web页面,构建可设置装备摆设PHP运用递次的正确体式款式,静态/动态编译在Apache+Php+Mysql的运用,基于PHP和AJAX竖立RSS聚合器,实用技巧:将PHP作为Shell脚本言语运用,用PHP完成windows资本管理器风格的树型菜单
      PHP

      Linux系统中关于文件编码和编码的转换
      在Linux下灵活使用expect脚本的小窍门,熟知Linux操作系统紧急情况处理方法,Linux环境下入侵工具Knark的分析及防范,Linux Shell学习:uniq命令使用方法介绍,Linux下的“暴破”软件,Linux下的18个Windows应用代用品,在Linux系统下如何增加一个新的系统用户,Linux-Wine上运行MS Office2007教程,Linux下通过GPRS模块拨号上网的方法,静态库和动态库 Linux系统程序设计之路,Linux中Mysql安装备份与密码恢复,在Linux系统上用Qpopper建立POP3服务器,Linux操作系统下简单的系统文件校验方法,制作运行在内存中的Linux系统,解决Linux系统下Twiki权限设置相关问题,Linux系统中关于文件编码以及编码的转换,Linux系统下如何使用rsync进行数据同步,linux apache目录添加密码,Firefox在Linux系统配置文件夹的默认路径 ,关于Linux为什么最多能分4个扇区的解释
      Linux文章

    • 0
    • 0
    • 0
    • 69
    • 单栏布局 侧栏位置: