精华内容
下载资源
问答
  • C语言 局部变量存储空间的分配和释放 奇怪现象及猜想

    C语言 局部变量存储空间的分配和释放 奇怪现象及猜想

    例如:

    #include<stdio.h>
    
    void foo(void){
            int i;
            printf("%d\n", i);
            i = 777;
    }
    
    int main(void){
            foo();
            foo();
            return 0;
    }

    结果:

    [root@localhost function]# ./function4.out 
    10067956
    777

    猜想一:哦那肯定是我记错了,改过来记吧,应该是“函数中的局部变量具有一直存在的固定的存储空间,每次函数调用时使用它,返回时也不释放,再次调用函数时它应该还能保持上次的值”。

    猜想二:教材上明明说“局部变量的存储空间在每次函数调用时分配,在函数返回时释放”,那一定是教材写错了,教材也是人写的,是人写的就难免出错,哦,连C99也这么写的啊,C99也是人写的,也难免出错,或者C99也许没错,但是反正运行结果就是错了,计算机这东西真靠不住,太容易受电磁干扰和宇宙射线影响了,我的程序写得再正确也有可能被干扰得不能正确运行。


    至于为什么出现这个现象以后解答。

    展开全文
  • 5 共享静态变量存储空间  我们知道类中的静态变量(Static Variable)在程序运行期间其内存空间对所有该类的对象实例而言是共享的,因此在某些时候为了节省系统内存开销,共享资源,将类中的一些变量声明为静态...

    5  共享静态变量存储空间

        我们知道类中的静态变量(Static Variable)在程序运行期间其内存空间对所有该类的对象实例而言是共享的,因此在某些时候为了节省系统内存开销,共享资源,将类中的一些变量声明为静态变量,可以通过下面的例子发现合理应用静态变量带来的好处:

    public class WeekA {
        static class Data {
            private int week;
            private String name;
            Data(int i, String s) {
                month = i;
                name = s;
            }
        }
        Data weeks[] = {
            new Data(1, "Monday"),
            new Data(2, "Tuesday"),
            new Data(3, "Wednesday"),
            new Data(4, "Thursday"),
            new Data(5, "Friday"),
            new Data(6, "Saturday"),
            new Data(7, "Sunday")
        };
    
        public static void main(String args[]) {
            final int N = 200000;
            WeekA weekinstance;
    
            for (int i = 1; i <= N; i++) {
                weekinstance = new WeekA ();
            }
        }
    }

        在上面这段代码中,没有将Data weeks 声明为静态变量,因此当创建WeekA对象时将会得到200 000个weeks对象的副本,这些对象被保存在内存中,但是weeks对象中的数据却从来没有被更改过,而且十分稳定,因此如果能使所有对象共享该数据对象是不错的解决办法,请看下面的代码:

    public class WeekB {
        static class Data {
            private int week;
            private String name;
            Data(int i, String s) {
                month = i;
                name = s;
            }
        }
        static Data weeks[] = {
            new Data(1, "Monday"),
            new Data(2, "Tuesday"),
            new Data(3, "Wednesday"),
            new Data(4, "Thursday"),
            new Data(5, "Friday"),
            new Data(6, "Saturday"),
            new Data(7, "Sunday")
        };
    
        public static void main(String args[]) {
            final int N = 200000;
            WeekA weekinstance;
    
            for (int i = 1; i <= N; i++) {
                weekinstance = new WeekB ();
            }
        }
    }

        请注意在类WeekB中,在Data weeks[]之前添加了static关键字,将该对象变量声明为静态的,因此当你创建200 000个WeekB对象时系统中只保存着该对象的一份拷贝,而且该类的所有对象实例共享这份拷贝,这无疑节约了大量的不必要的内存开销,同时实现了要完成的系统功能。

        如此说来,我们应该尽量地使用静态变量,其实不是这样的,因为静态变量生命周期较长,而且不易被系统回收,因此如果不能合理地使用静态比变量,就会适得其反,造成大量的内存浪费。因此建议在全部具备下列条件的情况下尽量使用静态变量:

            (1) 变量所包含的对象体积较大,占用内存较多。

            (2) 变量所包含的对象生命周期较长。

            (3)  变量所包含的对象数据稳定。

            (4) 该类的对象实例有对该变量所包含的对象的共享需求。

        如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。

    展开全文
  • 由编译器在需要的时候分配,在不需要的时候自动清楚的变量存储区。里面的变量通常是局部变量、函数参数等。 2、堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一...

    转自http://blog.csdn.net/xl890727/article/details/12657073

    常见的存储区域可分为:

    1、栈

    由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

    2、堆

    由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收。

    3、自由存储区

    由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来释放分配的内存。

    4、全局/静态存储区

    全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

    5、常量存储区

    这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。

     

    例1:C语言程序

    1. int x;  
    2. void main()  
    3. {  
    4. }

    变量x存储在内存哪个区域?

     

    答:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。

    BSS是英文Block Started by Symbol的简称。BSS段属于静态存储区。

     

    例2:static全局变量与普通全局变量有什么区别?

    答:static全局变量和普通全局变量存储区域相同,不同的是:

    static全局变量只在声明此static全局变量的文件中有效;

    普通全局变量对整个源程序都有效,当此源程序包含多于一个文件的程序时,对其他文件依然有效。

     

    例3:static局部变量与普通局部变量的区别?

    答:static局部变量的存储区为静态存储区,普通局部变量的存储区为栈;

    static局部变量生存周期为整个源程序,但是只能在声明其的函数中调用,并且其值与上一次的结果有关;而普通局部变量的生存周期为声明其函数的周期,超过特定的范围其值会被重新初始化;

    static局部变量如果未初始化其值默认为0,而普通局部变量则不确定。

     

     

    展开全文
  • 变量存储类型

    千次阅读 2018-08-01 15:40:47
    emmmmmmmm,今天做题遇到了一个问题,一个变量的默认存储类型。   一、 首先来说说数据的类型,所有的数据都有两种类型,一是常见的数据类型,如int,float等,一种便是今天的重头戏,存储类型。总共有四种存储...

    emmmmmmmm,今天做题遇到了一个问题,一个变量的默认存储类型。

     

    一、 首先来说说数据的类型,所有的数据都有两种类型,一是常见的数据类型,如int,float等,一种便是今天的重头戏,存储类型。总共有四种存储类型的变量,分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及寄存器变量(register)。

        先回顾一下定义

        1、自动变量:函数中所有的非静态局部变量。

        2、静态变量:在变量前加上static关键字的变量。

        3、外部变量:一般用作全局变量作用域的扩展(还有定义外部函数的时候前面也可以有一个extern关键字,具体外部函数请看下面)。

        4、寄存器变量:一般经常被使用的的变量(如某一变量需要计算几千次)可以设置成寄存器变量,register变量会被存储在寄存器中,计算速度远快于存在内存中的非register变量。

        二、存储变量关乎着变量的作用域和生存时间

        1、从作用域(空间)的角度来看:

        

        自动变量:其作用域仅仅局限于其定义的函数中,存储在动态存储区,注意存储在动态存储区的数据,在没有显式初始化的时候,其变量的值是随机的,无用的。

        静态变量:存储在静态存储区,静态变量包括静态全局变量和静态局部变量,静态变量在没有显式初始化的时候会被初始化为0或者null,并且只初始化一次(初始化不等同于赋值)。

                             静态全局(外)变量:作用域只是在其定义的源文件中有效,对外部变量起到了“屏蔽”的作用。

                             静态局部变量:其作用域是其定义的函数中。

        外部变量:把全局变量在其他源文件中声明成extern变量,可以扩展该全局变量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。

        寄存器变量:存储在cpu的寄存器中,速度快,一般不需要程序员定义寄存器变量,这是由于一些编译器会把需要参加很多次计算的变量转化成寄存器变量,不允许程序员对寄存器变量的地址进行操作。

        2、从生存时间的角度来看:

        自动变量:随着函数的进栈和出栈而创建和销毁

        静态变量:长期存在静态存储区,直到程序结束

        外部变量:长期存在静态存储区,直到程序结束

        寄存器变量:离开函数值就会消失

    展开全文
  • 我对局部变量存储空间分配和使用不明白是什么原理,望高手讲解一下。 比如有函数 void fun() { int a; int b; string c; } 我们都知道局部变量是分配在栈空间里,而且存储空间的栈就是有先进后出的机制,...
  • C++变量存储类型

    2012-07-15 22:06:46
    存储类型是从变量的存在时间(即生存期)来划分变量。...在程序开始就执行就为其分配存储空间,直到程序结束时,才收回变量存储空间,这种变量称为静态存储空间,其生命周期为整个程序执行的生命周期。
  • STM32全局变量占用程序存储空间吗?

    千次阅读 2013-05-10 00:53:35
    全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们: 全局自动变量——保存在读写数据段 全局静态变量——保存在读写...
  • 对“C++中何时对变量分配存储空间”的思考一、问题的引入一直被“C++中变量存储空间何时分配”困扰。在Visual studio2010中跑了一段代码,通过观察“监视窗口”中变量地址的变化和“内存窗口”,总结出一些自己的...
  • c语言变量存储方式

    千次阅读 2013-11-11 23:28:06
    c语言变量存储方式 动态存储方式(使用时动态分配存储空间,使用结束后释放) 1.auto变量: c语言规定,函数内未加说明的变量视为自动变量,可以省去说明符auto。 auto变量特点: 作用域仅限模块内,该模块结束...
  • C++变量存储位置

    千次阅读 2019-06-13 10:56:17
    转自:1.... ... C语言在内存中一共分为如下几个区域,他们分别是: 1 内存栈区: 存放局部变量名; 2 内存堆区: 存放new或者malloc出来的对象;...3 常数区:存放局部变量或...
  • C 变量存储类型

    2012-11-19 14:48:00
    在C语言中,供用户使用的存储空间分为三类:程序区、静态存储区、动态存储区。 程序存放的是可执行程序的机器指令;静态存储区存放的是在程序运行过程中需要占用的固定存储单元的变量,如全局变量动态存储区存放...
  • 函数局部变量所需存储空间分配

    千次阅读 2013-10-17 21:24:07
     栈是系统根据变量大小自动分配空间的  堆是你用new,malloc等手动分配空间的 2.  栈内存区的地址是连续的,由系统控制速度较快而  堆内存区的地址是不连续的,它是系统将空闲内存块链接起来的链表, ...
  • 变量存储类别

    2016-07-04 00:02:45
    所谓静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。先看一下内存中的供用户使用的存储空间的情况。这个存储空间可以分为...
  • 采用这种方式,变量所需的存储空间大小一致,因为变量只是保存了一个引用。也被称为对象语义和指针语义。 值语义:有些语言采用的不是这种方式,它们把变量的值直接保存在变量的存储区里,这种方式被我们称为值语义...
  • 变量存储类型

    2014-04-01 20:25:04
    存储类型是从变量的存在时间(即生存期)来划分变量。...在程序开始就执行就为其分配存储空间,直到程序结束时,才收回变量存储空间,这种变量称为静态存储空间,其生命周期为整个程序执行的过程。
  • JVM 变量存储位置

    千次阅读 2018-03-18 22:20:12
    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:方法执行时创建方法栈帧,存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量...
  • 变量存储方式

    千次阅读 2019-05-09 15:38:15
    动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式 内存中供用户使用的存储空间分为程序区,静态存储区和动态存储区 在动态存储区中存放一下数据 1 函数形式参数。在调用函数时给形参分配存储...
  • PHP变量存储方式初窥

    千次阅读 2020-04-20 23:34:17
    任何语言,都需要变量来对数据进行存储。在强类型语言当中,变量往往都会有特定的类型限制(字符串、数组、对象...)。而对于php这类弱类型语言,变量可以在不同的数据类型之间进行转换,同一个变量,可能上一时刻...
  • STM32 变量存储问题

    千次阅读 2014-10-15 19:03:50
    今天无意中在 局部变量里边定义了 一堆数组,结果 编译下载程序后发现chengx
  • C++变量存储类型

    2018-02-18 16:41:20
    变量存储类型   存储类型是从变量的存在时间来划分变量,可分为静态存储方式和静态存储方式。对于动态存储变量,当程序运行到该变量处时才为其分配存储空间,当程序运行到该变量所在作用域的结束处时自动收回为其...
  • 全局变量存储在静态数据区; 局部变量存储在动态数据区; 静态变量存储在静态数据区; 全局静态变量存储和局部静态变量都存储在静态数据区。   另: 静态函数和普通函数的区别: 静态函数在内存中维持一份,...
  • 变量存储区域的划分

    千次阅读 2016-11-15 23:11:50
    (以32位系统为例,Linux系统中每个进程共有3GB的用户地址空间,当用户调用系统调用时,内核线程会代表进程运行,此时是在内核空间内运行的,故所有进程共享1GB的内核空间. 所以,总的来说,每个进程可用的地址空间共有4GB...
  • 变量存储区域及其作用域

    千次阅读 2010-12-06 15:51:00
     按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个*********************************************变量可以分为:全局...
  • 全局变量存储类型

    千次阅读 2017-07-16 17:41:54
    全局变量存储类型 在函数外部定义的变量是全局变量,它的作用域是从变量的定义点开始,到本程序文件的末尾。全局变量分为两种:1.extern声明的变量 2.static声明的变量。 当未对全局变量指定存储类别时,隐含为...
  • C语言中局部变量和全局变量 变量存储类别(static,extern,auto,register)   局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参...
  • 变量存储以及变量的几种类型

    千次阅读 2019-09-16 14:45:12
    起初我们在内存中开辟一块空间用来存储数据,每一块空间都有一个地址值。但是如果有很多个地址值的时候,非常难以辨别和记忆,所以我们给每一个地址值定义一个变量。(如上面的name和number) 二、举例 我们在...
  • 关于一些设定变量以及变量存储的问题: 1 如果是同域的: 如果是回话的,可以用H5的:sessionStorage存储。存储格式是key-value,就是map的形式。sessionStorage.setItem/getItem等获取。 如果是非会话,要存在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 712,145
精华内容 284,858
关键字:

变量存储空间