概念理解:
1.变量:内存地址的抽象名字;静态编译的过程中,变量名会被转成内存地址;
- 内存高地址 栈区
- 堆区
- .bss段
- .data段
- 常量区
- 内存地地址 代码区
几个内存区间
2.栈区(stack):内存高地址,由编译器分配释放;
a.临时创建的局部变量;
b.函数的入口参数;
c.函数返回值;
d.const定义的局部变量;
3.堆区(heap):由程序员释放
a.用于存放程序运行中被动态分布的内存段,可增可减;
b.可以有malloc等函数实现内存的动态分布;必须用free进行内存释放,否则会造成内存泄漏;
4.全局区(静态区):程序结束后由系统释放;
由.bss段和.data段组成,可读可写;
1) .bss段
a.未初始化的全局变量;
b.初始化为0的静态变量和初始化为0的全局变量;
c.不占用可执行文件的空间,内容由操作系统初始化;
2) .data段
a. 已经初始化的全局变量;
b. 静态变量;
c. const定义的的全局变量存放在.rodata段;
5.常量区:由系统释放
1.字符串存放在常量区;
2.该区内容不能被修改;
6.代码区:存放函数体的二进制代码;
1.程序执行代码存放在代码区;
2.字符串常量也有可能存放在代码区;
测验:
#include <stdio.h>
static unsigned int val1 = 1; //val1存放在.data段
unsigned int val2 = 1; //初始化的全局变量存放在.data段
unsigned int val3 ; //未初始化的全局变量存放在.bss段
const unsigned int val4 = 1; //val4存放在.rodata(只读数据段)
unsigned char Demo(unsigned int num) //num 存放在栈区
{
char var = "123456"; //var存放在栈区,"123456"存放在常量区
unsigned int num1 = 1 ; //num1存放在栈区
static unsigned int num2 = 0; //num2存放在.data段
const unsigned int num3 = 7; //num3存放在栈区
void *p;
p = malloc(8); //p存放在堆区
free(p);
return 1;
}
void main()
{
unsigned int num = 0 ;
num = Demo(num); //Demo()函数的返回值存放在栈区。
}