原创 auto,register和static分析

2015-3-12 16:49 375 0 1 分类: MCU/ 嵌入式 文集: C语言

auto型变量:只能用于局部变量,局部变量默认情况下即为auto型。它会为变量在栈上分配空间。

注意:auto型变量不能用于全局型变量,因为全局型变量是在内存的静态存储区(全局存储区)上分配的空间,即堆空间上分配。

register型变量:寄存器型变量是将变量存放在寄存器当中,register只是请求寄存器变量,但不一定请求成功。

注意:1. register变量必须是CPU寄存器可以接受的值(如32位机器,只能存放32位即4字节的变量)。 2. 不能用&运算符获取register变量的地址(因为register变量存放在寄存器当中,而&是从内存地址当中取值,所以无法成功)。

static型变量:将变量存放在静态存储区,经常用于局部变量中,当局部变量被声明为static时,虽然其的作用域仅仅是自其函数内部,但整个变量在整个程序运行过程中都有效。而且此static局部变量仅仅赋初值一次(在第一次调用此局部变量所包含于的函数时)。

注意:static的另一个意义是文件作用域表示符。(1.static修饰的全局变量的作用域只是声明的文件中。2. static修饰的函数作用域只是声明的文件中),

下面举例说明上述几种变量使用出错实例(紫色部分为出错位置):

实例1:

#include <stdio>

auto int a=0;  //auto只能用于修饰局部变量,它是用于将变量存放在栈中,而非全局存储区

register int b=0;   /*因为静态存储区的变量一旦设定,在整个程序运行范围内都有效。如果将好几个全局变量都设为register型变量,则对应的这些寄存器在整个程序运行 周期中就只能放这个全局变量了。占用很多个不同寄存器,而CPU的寄存器是有限的,很容易导致寄存器被使用完导致崩溃,所以编译器不允许将 register型变量放在全局变量区。*/

int main()

{

    auto int i=0;

    auto int j=0;

    auto int k=0;

    printf(“%0X\n”,&i);

    printf(“%0X\n”,&j); //因为register变量存放在寄存器当中,而&是从内存地址当中取值,所以无法成功

    printf(“%0X\n”,&k);

    return 0;

}

 

作用域限定符:

test.c

#include <stdio>

extern int test2_g;

extern int test2_func();

extern int test2_ff();

int main()

{

       printf("%d\n",test2_g);        /*因为test2_g在文件test2.c当中是static型全局变量(作用域限定符),所以只能在test2.c文件中被访问。*/

       printf("%d\n",test2_func());  //同上理

       printf("%d\n",test2_ff());

        return 0;

}

 

test2.c

 

static test2_g=1;

 

static int test2_func()

{

    return test2_g;

}

 

int test2_ff()

{

    return test2_func();

}

广告

文章评论 1条评论)

登录后参与讨论

chencan1204_295885147 2015-3-14 19:43

好东西
相关推荐阅读
潇洒哥 2015-07-08 16:01
位操作符的使用技巧
在C语言编程中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效...
潇洒哥 2015-04-04 17:39
finish shell分析之底层usart
rt_thread的finsh shell系统不愧是调试的一项利器,它可以除了完成一般shell的功能外,甚至还可以自定义命令。这个对功能单一的嵌入式系统来说是十分可贵的。在此我并不想对finsh...
潇洒哥 2015-04-01 21:29
__main() 和 main()
因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置...
潇洒哥 2015-03-26 22:54
RT-Thread学习之scons篇--解析rtconfig.py文件
rtconfig.py文件,主要用于指定编译器以及安装路径。除此之外,该文件中定义了大量的变量,这些变量包括编译选项,汇编选项,链接选项。   import os # toolchain...
潇洒哥 2015-03-26 22:53
RT-Thread学习之scons篇--SConsruct脚本文件解析
       scons的构建文件名称是统一的都称为SConstruct。其是scons所接受的编译脚本主文件。当然为了方便目录的组织,也允许在各个目录下面存放SConscript, 然后最上面S...
潇洒哥 2015-03-26 22:53
RT-Thread学习之scons篇--SConcript文件解析
SConscript文件是用来指定哪些文件会加入编译。先来分析下BSP主目录下的SConscript文件: import rtconfig Import('RTT_ROOT') fro...
广告
我要评论
1
0
广告
关闭 热点推荐上一条 /2 下一条