【malloc 申请的变量、与局部变量、全局变量的区别】

【malloc 申请的变量、与局部变量、全局变量的区别】
    1. 无论全局变量还是局部变量都是系统自动分配管理的,内存分配在:静态储存区和动态储存区即栈;
    2. 全局变量:如果不人为初始化,系统自动初始化为0;
    3. 静态局部变量:编译时自动赋初始值(数值型初始化为0,字符型初始化为'\0',指针初始化为NULL);
    4. 函数内局部变量:如果不初始化他的值是不确定的,因为每次函数调用结束后储存单元已经释放,
  下一次调用是又重新分配储存单元,而其中内存的内容是不知道的。
    5. 1)malloc可以随时开辟,不用时随时释放;

2)这些数据是临时存放在一个特别的自由储存区,称其为堆;

                3)只能通过指针来引用:由于未在声明部分定义他们为变量或数组,故不能通过变量名或数组去引用这些数据包; 4)当定义一个变量或者定义一个数组的时候,程序编译链接的时候编译系统会自动为其分配内存。比如说定义一个结构体此时其中的结构体变量如果未初始化,就会被系统初始化,初始化规则见上面。

5)malloc开辟的结构体不会被系统自动初始化在使用前一定要初始化。
6)malloc为动作,而非定义变量。



【在嵌入式项目中,如何决定定义变量为局部变量,全局变量,malloc(需要申请)】

    1. 考虑到嵌入式设备中,内存比较小,要节省内存;
    2. 考虑到嵌入式设备CPU承受能力比较低,尽可能的把CPU放到数据处理之上,效率要高;
    3. 考虑到处理时间问题,需要尽可能的快。

换一种思考方式:根据需申请内存使用的频率,来决定。注意申请变量的作用域和生存周期。

如果经常使用请申请全局变量;
如果内存很大,请malloc分配内存,赋给一个全局变量指针,并初始化;
如果不经常使用请使用局部变量。



【程序中局部变量 全局变量 动态申请数据分别存储在什么地方?】

1. 变量的分类
每一个变量均有作用域和存储类别两个属性,这些属性共同用于描述一个变量。
1)根据作用域可分为全局变量和局部变量。
2)根据生存周期可分为静态存储方式和动态存储方式,具体地又分为自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。
静态存储方式是指在程序运行期间分配固定的存储空间的方式;
动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。

2. 不同类型的变量,其存储区域说明:
1)外部变量(全局变量)、静态外部变量、静态局部变量【存储在静态存储区】。
2)自动局部变量(局部变量默认为自动局部变量)、函数形参【存储在动态存储区】,不论是静态存储区还是动态存储区均属于内存中的用户区。
3)寄存器变量是存储在CPU寄存器中,而不是内存中。

3. 与作用域相关的几个属性:
1)局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,这种类型的变量就称为“局部变量”。
2)全局变量:在函数外定义的变量,可以为本源文件中其它函数所公用,有效范围为从定义变量的位置开始到本源文件结束,这种类型的变量就称为“全局变量”。

4. 与存储类型相关的几个属性:
atuo:在声明 局部变量时,若不指定 static,默认均是 auto,这类变量都是动态分配存储空间的,数据存储在动态存储区中。
static:在声明 局部变量时,使用关键字 static 将局部变量指定为“静态局部变量”,这样在函数调用结束后不消失而保留原值,在下一次函数调用时,该变量已有值就是上次函数调用结束时的值。
extern:用于扩展全局变量的作用域,比如如果函数想引用一个外部变量,但该外部变量在该函数后定义,那么这个函数需要使用 extern 来声明变量,这样才能使用 在该函数后面定义的全局变量。
此外,extern 还可以在多文件的程序中声明外部变量。
register:寄存器运算速度远高于内存;
在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。

由于变量从不同维度划分,形成了多种错综复杂的关系,在学习编程的时候需要重点关注。

猜你喜欢

转载自blog.csdn.net/llzhang_fly/article/details/79977907