新闻  |   论坛  |   博客  |   在线研讨会
单片机C语言中 static 用法小结
610396783 | 2012-03-30 19:54:33    阅读:13465   发布文章

一、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,那么第二次调用时(无论谁调用)a的初始值就是1,运行完就是2。

以上内容是以我爱研发网(52RD.com) - R&D大本英http://www.52rd.com/blog/Detail_RD.Blog_imjacob_5297.html为依据根据自己的理解表达出来的,欢迎大家来一起讨论,有不明白的地方可以参照原文。
      

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客