欢迎来到天天文库
浏览记录
ID:30775211
大小:98.50 KB
页数:7页
时间:2019-01-03
《c内存结构分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C••内存结构分析基础知识:—个由C/C++编译的程序占用的内存分为以下几个部分K栈区(stack)一由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)一一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3.全局区(静态区)(static)一,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。•程序结束后有系统释放4.文字常量区一常量字符串就是放在这里的。程序结束后
2、由系统释放5.程序代码区一存放函数体的二进制代码。'程序代码区戶C++程序的代码和数据是分开存放的,函数的代码都存储于代码区中。栈区堆区系统全局区f'文字常量区静态存储区通常,全局变量,静态局部变量以及文字常量都存储于这块区域中。例子程序//main.cpp#include#include//#include//malloc的头文件可以为#include也可以为#includevstdlib.h>#includeinta=0;全局初始化区char*pl;全局未初始化区main(
3、){constchar*m="123456";〃指向常量的指针intb;栈chars[]="abcH;栈char*p2;栈char*p3=”123456”;123456在常量区,p3在栈上。staticintc=0;全局(静态)初区pl=(char*)malloc(10);p2=(char*)malloc(20);分配得来得10和20字节的区域就在堆区。strcpy(plz”123456”);123456放在常量区,编译器可能会将它与p3所指向的X23456”优化成一个地方。cout<<(m==p3?l:0)<4、l;//结果为0cout<5、序的整个运行期间都存在。例如全局变量,static变量。c:documentsandsettingsadmimstratoconst』的地址是询041B008conm.a的士也亚是:0012FE3CPtu指帘神保岸励值最23p"2指针中保存的值是=274148040对于这个,我们可以看个例子:3voidtest(){staticintconst^a=23:intcomm^a=44:std::cout«地址是"«&const」«std::endl;std::cout«"comin_盘)地址是:"«&comm_a«std::endl;}minttmain(intargc?TCHA6、R*argy[]){"-test0;int*ptr=(int*)0X0041B008;std::cout«"ptf指针中保存的值是“«*ptr«std::endl:int*ptr2=(int*)0x0012FE3C;std::cout«,vptr2指针中保存的值是《*ptr2«std::endl;析:在这里我们主要讨论静态变量(在函数内定义)与普通变量这间的生命同期,在test函数中,我们定义了一个静态变量const_a,假设保存在编号为0041b008地址块中,同时定义了一个普通变量Comm_az假设其保存地址是0012FE3C。在main函数中,我们执行test函数,执行完后7、,我们直接从上面两个地址块去取数据,我们可以看到静态变量所在的地址块的值一直存在,因为它的值是分配在了全局代码区,而普通变量所在的块,因为函数已经执行完毕,分配在栈上的空间被回收,并重新赋了一个随机值,我们再也取不出里面原有的数据了。还有,大家可以查看反汇编代码,会发现全局变量编译时就已经分配好内存了,只是在我们用时将这块地址強合我们的变量指针而已:••=23i<■专通=I>反编代码为*i»vIv^d44WW>//通过编译量在取值■常量区:文字常量分配在文字常量区,程序结束后由系
4、l;//结果为0cout<5、序的整个运行期间都存在。例如全局变量,static变量。c:documentsandsettingsadmimstratoconst』的地址是询041B008conm.a的士也亚是:0012FE3CPtu指帘神保岸励值最23p"2指针中保存的值是=274148040对于这个,我们可以看个例子:3voidtest(){staticintconst^a=23:intcomm^a=44:std::cout«地址是"«&const」«std::endl;std::cout«"comin_盘)地址是:"«&comm_a«std::endl;}minttmain(intargc?TCHA6、R*argy[]){"-test0;int*ptr=(int*)0X0041B008;std::cout«"ptf指针中保存的值是“«*ptr«std::endl:int*ptr2=(int*)0x0012FE3C;std::cout«,vptr2指针中保存的值是《*ptr2«std::endl;析:在这里我们主要讨论静态变量(在函数内定义)与普通变量这间的生命同期,在test函数中,我们定义了一个静态变量const_a,假设保存在编号为0041b008地址块中,同时定义了一个普通变量Comm_az假设其保存地址是0012FE3C。在main函数中,我们执行test函数,执行完后7、,我们直接从上面两个地址块去取数据,我们可以看到静态变量所在的地址块的值一直存在,因为它的值是分配在了全局代码区,而普通变量所在的块,因为函数已经执行完毕,分配在栈上的空间被回收,并重新赋了一个随机值,我们再也取不出里面原有的数据了。还有,大家可以查看反汇编代码,会发现全局变量编译时就已经分配好内存了,只是在我们用时将这块地址強合我们的变量指针而已:••=23i<■专通=I>反编代码为*i»vIv^d44WW>//通过编译量在取值■常量区:文字常量分配在文字常量区,程序结束后由系
5、序的整个运行期间都存在。例如全局变量,static变量。c:documentsandsettingsadmimstratoconst』的地址是询041B008conm.a的士也亚是:0012FE3CPtu指帘神保岸励值最23p"2指针中保存的值是=274148040对于这个,我们可以看个例子:3voidtest(){staticintconst^a=23:intcomm^a=44:std::cout«地址是"«&const」«std::endl;std::cout«"comin_盘)地址是:"«&comm_a«std::endl;}minttmain(intargc?TCHA
6、R*argy[]){"-test0;int*ptr=(int*)0X0041B008;std::cout«"ptf指针中保存的值是“«*ptr«std::endl:int*ptr2=(int*)0x0012FE3C;std::cout«,vptr2指针中保存的值是《*ptr2«std::endl;析:在这里我们主要讨论静态变量(在函数内定义)与普通变量这间的生命同期,在test函数中,我们定义了一个静态变量const_a,假设保存在编号为0041b008地址块中,同时定义了一个普通变量Comm_az假设其保存地址是0012FE3C。在main函数中,我们执行test函数,执行完后
7、,我们直接从上面两个地址块去取数据,我们可以看到静态变量所在的地址块的值一直存在,因为它的值是分配在了全局代码区,而普通变量所在的块,因为函数已经执行完毕,分配在栈上的空间被回收,并重新赋了一个随机值,我们再也取不出里面原有的数据了。还有,大家可以查看反汇编代码,会发现全局变量编译时就已经分配好内存了,只是在我们用时将这块地址強合我们的变量指针而已:••=23i<■专通=I>反编代码为*i»vIv^d44WW>//通过编译量在取值■常量区:文字常量分配在文字常量区,程序结束后由系
此文档下载收益归作者所有