代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。
常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)
静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放
堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏
栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i = 10; /*全局区/静态区*/
static m = 1; /*全局区/静态区*/
int main()
{
int a = 3;/*栈*/
int b = 3;/*栈*/
char *c;/*栈*/
char *p = "abc";/*常量区*/
char *e = (char *)malloc(10); /*堆区*/
static n = 1; /*全局区/静态区*/
printf("address i = 0x%X\n", &i);
printf("address a = 0x%X\n", &a);
printf("address b = 0x%X\n", &b);
printf("address c = 0x%X\n", c);
printf("address p = 0x%X\n", p);
printf("address e = 0x%X\n", e);
c = p;
strcpy(e, p);
printf("address c = 0x%X\n", c);
printf("address e = 0x%X\n", e);
printf("address m = 0x%X\n", &m);
printf("address n = 0x%X\n", &n);
printf("address main = 0x%X\n", main);
return 0;
}
kayshi@ubuntu:~/code/Test$ ./test2
address i = 0x21A16010
address a = 0xE5BD54A8
address b = 0xE5BD54AC
address c = 0xE5BD55B0
address p = 0x21815954
address e = 0x22468260
address c = 0x21815954
address e = 0x22468260
address m = 0x21A16014
address n = 0x21A16018
address main = 0x2181574A
全局区/静态区 是 i,m, n 地址0x21A16010,0x21A16014,0x21A16018是连续的
栈区是a, b, c 地址为 0xE5BD54A8,0xE5BD54AC,0xE5BD55B0
堆区是e 地址为 0x22468260
常量区为p 地址为 0x21815954 后面的c = p 指针c原来是指向堆区的,现在指向的常量区
代码区main函数的地址为 0x2181574A
通过与上图的比较可以得到。分配的位置符和
区域 | 地址 |
---|---|
栈区 | a :0xE5BD54A8 |
堆区 | e:0x22468260 |
静态区(全局区) | i:0x21A16010 |
常量区 | p:0x21815954 |
代码区 | main:0x2181574A |