• 娓娓道来c指针 (2)内存分配


                                (2)内存分配

    c语言中描写叙述变量的时候经常使用的两个用语

    1.作用域:也叫可见域,指的是变量的作用范围。

    在哪个范围内。该变量是可见的、能够使用的。

    2.生存期:也叫存储期。指的是变量从创建到销毁的生存时间段。

    作用域和存在域是两个不同的概念。比方在程序的某个位置。某变量存在(内存中分配了地址)但不可见(不可使用)。

    作用域

    从作用域看。变量分为下面三种:

    1.全局变量

    在c语言中,把在不论什么函数之外声明的变量称为全局变量。普通情况下。全局变量在不论什么地方都是可见的。

    当然也有例外,比方在语句块{}内声明了一个同名的局部变量。则该全局变量会临时不可见。

    //全局变量
    int foo = 5;
    void fun()
    {
    	printf(" fun()->foo...%d
    ", foo);
    }
    int main()
    {
    	int bar = 3;
    	printf("main()->foo...%d
    ", foo);
    	printf("main()->bar...%d
    ", bar);
    	{
    		//局部变量,屏蔽同名全局变量foo
    		int foo = 6;
    		printf("    {}->foo...%d
    ", foo);
    		//局部变量。屏蔽同名局部变量bar
    		int bar = 4;
    		printf("    {}->bar...%d
    ", bar);
    	}
    	fun();
    	return 0;
    }
    执行


    从执行结果能够看出全局变量的可见范围。当然,假设在全局变量未被声明之前就试图使用它,则也会出错。(这与规则:“未声明,不可使用”有关。

    )

    除此之外,c中的设计思想是:一个全局变量也是一个默认的外部变量(extern)。也就是说,一个全局变量不仅在本文件里是全局可见的。在别的文件里也是可见的。如

    //1.c
    int foo;
    在还有一个文件里有

    //2.c
    int foo;
    编译报错:foo被反复定义,命名冲突。

    这样的默认行为被广为诟病。不少人觉得,变量的可见域默认下应仅限于当前文件,须要扩大时,应该由程序猿自己控制。

    而且对于函数,也有相同的默认行为。

    怎样防止这样的行为?

    (1)若是确实须要使用一个同名的变量,则可对已存在的同名全局变量用static修饰,使之成为静态的全局变量。这样它的可见域,就仅限于它所在的文件之内。

    //1.c
    static int foo; //可见域被限制于本文件内
    在还有一个文件里又一次声明 int foo; 没有问题。

    (2)不定义新的,直接使用别的文件里的全局变量。语法是 extern int foo; keyword extern 是外部的意思,表明变量 foo,已在别的地方定义,这里仅仅是在使用之前。作一个声明而已,不是反复定义。当然不作此声明也是不可用的。这再次体现了:可见,但不一定可用。


    2.文件内部的静态变量

    这就是上文中说的静态的全局变量。


    3.局部变量

    在函数中。或更直接的说是在语句块{}内定义的变量,是局部变量。它的可见域仅限于语句块内,在其他地方无法引用。局部变量在函数被调用时由系统分配存储区。在不同的函数中同名的变量实际上在内存中占不同的单元。因此在不同的函数中能够定义同样名字的局部变量。

    如函数的形參。main函数中定义的变量都是局部变量。

    对作用域进行总结

    c语言中存在三种作用域

    (1)块作用域
    自己主动变量(auto、register)和内部静态变量(static)具有块作用域。在一个块内声明的变量,其作用域从声明点開始。到该块结束为止。

    函数定义中声明的形參。其作用域限定在该函数体内,与其它函数中声明的同名变量不是一回事,同意在不同的函数中使用同样的变量名。编译器将为这些变量分配不同的存储单元。不会冲突。


    (2)文件作用域
    外部静态变量(static)具有文件作用域。从声明点開始到文件末尾,此处所指的文件是编译基本单位—c文件。
    (3)全局(程序)作用域
    全局变量(extern)具有全局作用域,仅仅要在使用前对其进行声明,便可在程序(由若干个文件组成)的任何位置使用全局变量。


    生存期

    从生存期看。分为下面三种:

    1.静态变量(static variable)

    全局变量和指定static的局部变量,都具有静态存储期。它们从程序開始一直到程序结束都存在,故被统称为静态变量。


    2.自己主动变量(auto variable)

    没有被指定为static的局部变量和寄存器变量(register variable)都是自己主动变量。函数的形參及代码块中定义的变量都属于auto变量,这是C语言中应用最广的一种变量,这类变量是栈分配的,是动态分配存储空间的。举函数形參为例。当调用该函数时。为形參分配存储空间,当函数调用结束时。就自己主动释放这些存储空间。对代码块中定义的变量(包括函数中定义的变量),当运行到变量声明语句时。系统为这些auto变量分配空间,当程序流程离开代码块时,这些变量被自己主动撤销,其占用的内存空间被释放。


    3.堆变量

    通过malloc()函数分配内存区域的变量被放在堆中。故称为堆变量。而且似乎这个“堆”和数据结构中的堆没有什么联系。仅仅是一种称呼而已。这样的变量须要手动释放内存区域:free(变量名),也就是说它从创建时起就一直存在直到使用free()释放为止。当然。即使最后忘了释放。现在的操作系统也会在程序结束后释放为它分配的内存。

    只是仍然建议:谁创建,谁释放。


    专栏文件夹:


  • 相关阅读:
    Brain network involved in autonomic functions 与自主功能相关的大脑网络
    Brief summary of classical components of ERP 事件相关成分(ERP)经典成分小结
    ICA & Percentage Variance Account For (PVAF)
    数据处理中白化Whitening的作用图解分析
    Loadings vs eigenvectors in PCA 主成分分析(PCA)中的负荷和特征向量
    主成分分析(PCA)和独立成分分析(ICA)相关资料
    Sketch of heart and QRS complex 心脏及QRS波群简图
    Brain Network visulation in EEG 脑电网络可视化
    Phase Locking Value (PLV) 神经信号的锁相值
    ubuntu16.04下的一些基本操作笔记
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6764301.html
Copyright © 2020-2023  润新知