您的位置:首页 > 其它

程序在内存中存储详情(Text、Data、BSS、Heap、Stack....)

2013-11-21 13:22 525 查看

先看下面的一段程序:

char *string =
"Hello World";

int iSize;

char *fun(void)

{

     char *p;

     iSize = 8;

     p = malloc(iSize);
     return p;

}

存放的位置(相同的颜色对应)

Text段:上面标记为红色的部分(还包括整个fun函数,由于下边需要,所以没有标记)都存放在Text段,Text段用来存放代码(二进制文件)和常量,该段的数据通常是只读的

例:

[cpp]
view plaincopyprint?

char *p = "Hello";  
  
p[0] = 'a';  

char *p = "Hello";

p[0] = 'a';


 VC6.0下,编译无错,但运行是提示内存不可写,这就是因为"Hello"存放在Text段,它是只读的,你不能去修改它.

Data段: 已经初始化了的全局变量string就存放在该段,Data段用来存放初始化了的变量,即初始化了的全局变量和静态变量

 

BSS段: 未初始化的全局变量iSize存放在这,BSS段主要存放在未初始化的变量,即未初始化的全局变量和静态变量

 

Heap段: 程序员手动分配的malloc(iSize)这篇内存存放在该段,也需要用户自行释放

 

Stack段:函数里的局部变量*p存放在该段,Stack段主要存放局部变量、临时变量、函数相互调用的返回的地址,该段由编译器自行分配和释放

 

那接下来我们来看看,它们什么被分配了内存,什么时候释放内存:

全局变量和静态变量:程序开始的时候就分配了,程序结束时候释放内存。

局部变量:函数调用的时候为变量分配内存,调用结束释放内存。

堆里的:调用malloc时分配内存,调用free时释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: