作者:yangaien | 来源:互联网 | 2023-09-07 08:11
如题,我查了很多资料,有些说分五种:堆、栈、自由存储区、全局静态存储区和常量存储区。详见:http:dev.yesky.com4602379960.shtml有些说分三种:
如题,我查了很多资料,
有些说分五种:
堆、栈、自由存储区、全局/静态存储区和常量存储区。详见:http://dev.yesky.com/460/2379960.shtml
有些说分三种:
堆、栈和静态存储区 。 详见http://dev.yesky.com/105/2030105.shtml
林锐的《C++高质量编程》好像也是分三种。
还有的分四种:
代码区 全局数据区 堆区 栈区 。详见http://baike.baidu.com/view/536145.html?wtp=tt
请问 “代码区 ”到底怎么回事?几种分法有什么区别和联系?
10 个解决方案
你的问法不对, C++只是编程语言, 内存是操作系统分配的.
代码区属于程序空间, 不能访问, 就象医生不能给自己治病一样
对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区,动态数据区。
动态数据区一般就是 堆栈。
栈(stack)和堆(heap)是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。
说法不一啊,堆、栈、自由存储区、全局/静态存储区和常量存储区
你能区分哪些数据在这5个区就可以了。
研究这个意义不大,不同编译器,可能行为不同,如果是VC的话,基本上如下:
代码区,是编译器生成的一个Exe区段,拥有可读和可执行属性,但是实际上如果不开DEP数据执行保护,所有的区段都是可执行的,当然包括栈。
所谓的栈区,低地址(小于Exe基地址),拥有可读写属性,Exe中没有对应的区段,系统加载DLL时自动生成,由于内存地址使用方式从大往小减,所以数量有限,尽量不要定义过大的数组变量。
所谓的堆区,就是malloc和new之类的内存所在区段,拥有可读写属性,Exe中没有对应的区段,系统加载DLL时自动生成,首先是利用栈区地址下面的区段,也是低地址,当用完了,会自动分配稍微高一点地址(大于Exe基地址)。
全局数据区,是编译器生成的一个Exe区段,拥有可读写属性。
常量区,是编译器生成的一个Exe区段,只有可读属性,比如char* s = "Hello World",这时候"Hello World"就在常量区,由于没有可写属性,所以修改内容会出错。
但是,所有区段的属性都可以通过VirtualProtect修改,所以到底怎么用,还是自己看着办吧。
w_anthony 的水平真高。
就是想理解内存方面,看资料看了版本不一,迷惑而已。
http://blog.pfan.cn/zhaoyg/35045.html那是根据是C语言还是C++语言来定义的。建议看下我给你的链接。