zoukankan      html  css  js  c++  java
  • (二)内存分配

    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;
    }

    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()释放为止。当然,即使最后忘了释放,如今的操作系统也会在程序结束后释放为它分配的内存。不过仍然建议:谁创建,谁释放。

  • 相关阅读:
    db_keep_cache_size參数的控制范围測试
    怎样写面向互联网公司的求职简历
    servlet获取参数
    mybatis
    java常用API
    java IO
    ajax创建
    java 泛型中 T、E ... 和 问号(通配符)的区别
    java Arrays对数组操作
    org.json 使用
  • 原文地址:https://www.cnblogs.com/huangjianping/p/8283445.html
Copyright © 2011-2022 走看看