zoukankan      html  css  js  c++  java
  • 娓娓道来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()释放为止。当然。即使最后忘了释放。现在的操作系统也会在程序结束后释放为它分配的内存。

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


    专栏文件夹:


  • 相关阅读:
    HuanGe'Linux Store上线了!
    4555
    google 代码
    曾经红透半边天的郭盛华,如今却拿着月薪5千的工资过生活,网友:到底经历了什么?
    揭秘:AI人工智能和摩尔定律的后指数时代
    黑客开始跨界攻击了,网络安全的未来在云端
    传奇人物郭盛华:汽车黑客,远远比我们想象中还要恐怖
    Facebook再现丑闻,约100位应用程序开发人员偷看用户数据
    郭盛华现身北京机场,颇有IT男的风范,网友:疑似被招安了
    郭盛华:中国网络的守护神,美俄黑客也要俯首称臣
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6764301.html
Copyright © 2011-2022 走看看