一、c程序存储空间布局
C程序一般由下列部分组成:
1)正文段——CPU履行的机器指令部分;少数的液晶字库等也放在这儿;只读,避免程序因为意外事故而修正本身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,寄存在这儿。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
4)栈——增加方向:自顶向下增加;主动变量以及每次函数调用时所需求保存的信息(回来地址;环境信息)。
5)堆——动态存储分。
|———–|
| |
|———–|
| 栈 |
|———–|
| | |
| |/ |
| |
| /| |
| | |
|———–|
| 堆 |
|———–|
| 未初始化 |
|———–|
| 初始化 |
|———–|
| 正文段 |
|———–|
二、static的效果
1、内部标识,也便是说无论是界说函数仍是变量,只需有了static,就不能被外部调用;
举例说明:static char i = 0;
static int putchar(int c );
{
static char a = 0;
….a++;…..
}
extern sprintf(const char *format , … );
{
putchar(…);
}
假定以上变量及函数都在uart.c的文件中main()函数是在main.c中,那么,在main中只能调用sprintf,而不能直接调用putchar,也不能直接用变量 i。
2、静态变量,我以为这个是针对于static界说的部分变量而言的,除了只能在界说它的函数内部分运用外其他的和全局变量是相同的(只在第一次调用时初始化,用完后空间不会开释,已存值不会改动)。比方说以上的a在第一次调用时被初始化为0.然后自加为1,那么第2次调用时(无论谁调用)a的初始值便是1,运转完便是2。