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

原创 2018年04月17日 17:25:32
【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,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。

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

c语言中变量(存储区 栈)和malloc(动态申请 堆)的区别

1、变量: 不管全局变量还市局部变量都是系统自动分配管理的(静态储存区和动态存储区即栈),全局变量如果不人工初始化时系统会自动初始化;对于静态局部变量,编译时自动赋初值初始化;自动局部变量不初始化,...
  • zhou_qiao62
  • zhou_qiao62
  • 2017-01-02 19:52:28
  • 1370

C语言中定义变量(储存区 栈)和用malloc(动态分配 堆)的区别

一.变量:    不管全局变量还是局部变量都是系统自动分配管理的,全局变量如果不人工初始化时系统自动初始化;对于静态局部变量,编译时自动赋初始值(数值型初始化为0,字符型初始化为'\0',指针初始化为...
  • hanghangde
  • hanghangde
  • 2015-12-21 13:11:45
  • 2771

局部变量全局变量和动态分配的数据分别在内存中存放的位置

局部变量分配的内存在栈里:栈大小与编译器有关。默认情况下,visual studio 2010 的栈大小为1M。 全局变量存放在静态存储区:对于全局变量来说,与编译器有关,默认情况下, VS201...
  • qq_16209077
  • qq_16209077
  • 2016-02-28 20:31:06
  • 15484

static全局变量与普通全局变量区别?static局部变量与普通局部变量区别?static函数与普通函数区别?

static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?    答: 1) 全局变量(外部变量)的说明之前再冠以static...
  • u012497906
  • u012497906
  • 2015-09-17 15:45:21
  • 2136

局部变量和全局变量以及成员变量的区别

@interface Person : NSObject { // 成员变量: // 写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量) // 成员变量只能...
  • yaoliangjun306
  • yaoliangjun306
  • 2016-06-13 21:19:33
  • 904

普通局部变量、普通全局变量、static局部变量、static全局变量

一、普通全局变量和普通局部变量的关系 通常情况下,如果有两个同名变量,一个是普通全局变量,另一个是普通局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。 #include #...
  • u011484045
  • u011484045
  • 2015-03-23 10:40:37
  • 3523

局部变量和全局变量的区别

局部变量可以与全局变量重名,但是局部bianl
  • cgl1079743846
  • cgl1079743846
  • 2014-05-29 09:20:47
  • 39226

关于全局变量指针直接 malloc分配内存的一些问题

一个对比:对于语句:int i = 3int main(){    int j = i;    ...}在编译时不需要确定局部变量 j 的值,而是在运行时读取i 的值来赋给 j. 编译连接后的可执...
  • lhuoshan
  • lhuoshan
  • 2010-11-18 14:43:00
  • 8497

IOS 成员变量,全局变量,局部变量定义,static与extern的区别

1,先说定义  1)成员变量定义:生存与该类的生命周期,变量存活周期跟你定义的该类实体对象一样;作用域是整个实体对象;可以在h文件中声明或者在m文件中@implementation上面添加的 ...
  • yidu_blog
  • yidu_blog
  • 2016-03-07 18:37:58
  • 520

python里面的全局变量和局部变量的区别小讲

不知道大家有没有这样的一个疑惑: name = "head first python" def what_happens_here():     print(name)     nam...
  • scuter_yu
  • scuter_yu
  • 2015-03-20 20:14:28
  • 1112
收藏助手
不良信息举报
您举报文章:【malloc 申请的变量、与局部变量、全局变量的区别】
举报原因:
原因补充:

(最多只允许输入30个字)