内存

来源:互联网 发布:追梦美工学院 编辑:程序博客网 时间:2024/05/02 02:48

一个由 c/C++ 编译的程序占用的内存分为以下几个部分 、
 1、栈区( stack stack stack stack )
由编译器自动分配释放,存放函数的参数值,局部变量的值等。 、
 2、堆区( heap heap heap heap )
一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。 、
3、全局区(静态区) ( static static static static )
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变
量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。 、
4、文字常量区
常量字符串就是放在这里的。 程序结束后由系统释放。 、
 5、程序代码区
存放函数体的二进制代码。

ep:main()
{
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = "123456"; //123456\0 在常量区, p3 在栈上。
static int c =0 ; // 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // 分配得来得 10 和 20 字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0 放在常量区,编译器可能会将它与 p3 所指向的 "123456" 优化成一个地方。
}
6、全局变量和静态变量的地址分配是连在一起分配的,也就是说他们的地址是连续的
int g1=0, g2=0, g3=0;
void main( )
{
 static int s1=0, s2=0, s3=0;
 int v1=0, v2=0, v3=0;
 // 打印出各个变量的内存地址
 printf("0x%08x\n",&v1); // 打印各局部变量的内存地址
 printf("0x%08x\n",&v2);
 printf("0x%08x\n\n",&v3);
 printf("0x%08x\n",&g1); // 打印各全局变量的内存地址
 printf("0x%08x\n",&g2);
 printf("0x%08x\n\n",&g3);
 printf("0x%08x\n",&s1); // 打印各静态变量的内存地址
 printf("0x%08x\n",&s2);
 printf("0x%08x\n\n",&s3);
}
输出的结果是:0x0012ff7c
0x0012ff78
0x0012ff74

0x00425798
0x0042579c
0x004257a0

0x004257a4
0x004257a8
0x004257ac
由结果可以看出,v1、v2、v3和其他六个变量的内存地址没有一点联系,而g1、g2、g3、s1、s2、s3的地址是连续的,因为g是全局变量,而s是静态变量。

原创粉丝点击