本文主要讲解内存是怎么分配的有助于c语言的学习。
下面列出C语言可执行程序的基本情况(Linux 2.6环境/GCC4.0)。

代码区顾名思义就是存放代码的,里面的内容是不可以修改的。例如你定义了一个变量char *buff = 或quot;abcdef或quot;;这个char型指针指向了代码区,这个指针里面的数据只可以被读取不可以别修改,因为指针指向了代码区,如果你继续往这个指针里面放东西,会报段错误。例如:buff[1] = 或#39;a或#39;,这样会报错,段错误。因为上面已经将buff指向了代码区,代码区的数据是不可以改变的,但是你想要给buff[1]赋值,这时编译的时候不会报错,但是运行的时候会报段错误,这种错误对于初学者来说相当恶心,如果报段错误建议给我使用gdb调试。段错误大部分是因为内存使用错误。

栈区:系统分配,系统释放(跟堆区最重要的区别)。看图:正确的是因为指针指向了栈区,栈区的数据是可以改变的,所以第一个buff[1] = 或#39;a或#39;;是正确的第二个是错误的(第二个指向了代码区)

堆区:说白了就是由程序员分配一块内存,然后往这块内存中写数据,栈区是系统分配内存然后往里面写数据,栈区是有系统释放,但是堆区的内存必须有程序员释放,不然会造成内存泄露(后果相当严重,会造成死机现象)。
C 中由new和delete来分配和释放,C中由malloc和free来分配和释放。

数据区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。

总结:看下图:

- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
