内存区域分为:堆、栈、全局/静态存储区和常量存储区。
注:常量放在常量存储区,不被修改。
(1)堆:由程序员调用系统内存函数分配的内存块,根据需要动态分配,由程序员管理,编辑器不会释放。
(2)栈:在需要时候由系统分配,在不需要时候自动清除的变量存储区。通常是局部变量、函数参数等。编辑器时刻分配。
(3)局部/静态变量:
例子:变量和函数参数都在——栈
void foo(void)
{
int x=3;
printf("\n%d",x);
}
//定义函数,当被调用时,系统根据函数的定义,将变量x在栈上分配了一块4字节的内存。x的生存期是foo函数的生存期,当“}”结束后,x栈上分配的内存区域对于x来说已经无效了,x也不再存在。(其中赋初值步骤:a.编辑器添加一个变量名到变量符号表中,b.编辑器在栈内存中分配一个4字节的内存块。c.编辑器在变量符号表中关联刚分配的内存块首地址和变量名,d.运行时,执行到这条语句,将初值3填入到分配的内存块中。)如果仅仅声明变量如int ;不会分配内存
例子:
#include<stdio.h>
void main(void)
{
intx;
inty;
x=0x76543210;
y=0xfedcba98;
printf("\n%x",&y); //输出 y的地址
printf("\n%d,%d",x,y);//输出想,y十进制的数值
}
该例子中,x可以拆分成0x76,0x54,0x32,0x10,假设x在内存中的起始地址为2000(自动分配),则:
printf("\n%x",&y); 这句为取y地址,输出为y的地址,即:18ff40
调试过程:在printf("\n%x",&y);按F9设置断点,按F5调试运行,则输出18ff40(此时可以在调试工具merry中输入该地址,可以看到y的数值),再按F5则输出xy的十进制值