zoukankan      html  css  js  c++  java
  • C语言基础---C语言中的变量与内存空间的关系

      C语言中变量总体分为全局变量,局部变量以及动态分配内存的变量。

      它们在内存中占据的存储区是不同的,全局变量一般分配在静态存储区;非静态的局部变量(包括形参)一般分配在内存中的动态存储区,这个存储区是一个称为栈的区域;除此之外C语言还允许建立内存动态分配区域,以存放一些临时的数据,这些变量不需要在程序的声明部分定义,也不需要等到函数结束自动释放空间。这些数据被存储在特别的自由存储区,称为堆区。可以根据需要,向系统申请所需大小的空间。由于未在申明部分,定义他们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。

    简述C语言中内存的动态分配

      对内存的动态分配是通过系统提供的库函数实现,主要又malloc,calloc,free,realloc这四个函数。

    1.使用malloc函数

      函数原型:void *malloc(unsigned int size);

      其作用是在内存的动态存储区分配一个长度为size的连续空间,形参size的类型称为无符号整型(不允许为负数),此函数的返回值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。

      eg:malloc(100);  /*开辟100字节的临时分配域,函数值为为其第一个字节的地址*/

    2.使用calloc函数

      函数原型:void *calloc(unsigned n,unsigned size);

      其作用是在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。

      使用calloc可以为一位数组开辟动态存储空间,n为数组的元素个数,每个元素长度为size,这就是动态数组。函数返回所分配区域起始位置的指针;如果分配不成功,返回NULL。

      eg:p = calloc(50,4);  /*开辟50*4字节的临时分配区域,把起始地址赋值给指针变量p*/

    3.使用free函数

      函数原型:void free(void *p);

      其作用是释放指针变量p所指向的动态空间,使这部分空间能够被其他变量所使用。p应该是最近一次调用calloc或malloc函数时得到的函数返回值。

      eg:free(p);  /*释放指针变量p所指向的已分配的动态空间*/

    4.使用realloc函数

      函数原型:void *realloc(void *p,unsigned int size);

      如果已经通过malloc函数或者calloc函数获得了动态空间,想改变其大小,可以用realloc函数重新分配。

      用realloc函数将p所指向的动态空间的大小改变为size,p的值不变,如果重分配不成功,返回NULL。

      eg:realloc(p,50);  /*将p所指向的已分配的动态空间改成50个字节*/

    以上四个函数声明在<stdlib.h>头文件中。

    静态存储和动态存储简介

      静态存储方式是指在程序运行期间由系统非陪固定的存储空间的方式,而动态存储方式则是在程序运行期间根据需要进行动态存储空间分配的方式。

      内存中供用户使用的存储空间情况可分为以下三部分:

      (1)程序区(2)静态存储区(3)动态存储区

      全局变量全部存放在静态存储区。在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中他们占据固定的存储单元,而不是动态的分配和释放。

      在动态存储区中存放以下数据:

      ①函数的形式参数。在调用函数时给形参分配存储空间。

      ②函数中定义的没有用关键字static声明的变量,即自动变量。

      ③函数调用时的现场保护和返回地址等。

      针对以上这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放时动态的,如果一个程序中两次调用到同一个函数,而在此函数中定义了局部变量,在两次调用时分配给这些局部变量的存储空间的地址可能是不相同的。

    静态局部变量

      有时希望函数中的局部变量的值在函数调用结束以后不消失而继续保留原值,即其占用的内存存储单元不释放,在下次调用时,该变量已有值(就是上一次函数调用的值,这时候就应该指定该局部变量为“静态局部变量”)

    全局变量的存储类别 

       1.在一个文件内扩展外部变量的作用域

      如果外部变量不在文件的开头定义,其作用域只限于从定义处到文件结束。在定义点之前的函数不能引用该外部变量,如果在定义点之前的函数需要引用该变量,则应该在引用之前用关键字extern对该变量做“外部变量声明”,表示将该外部变量的作用域扩展到此位置。

      2.将外部变量的作用域扩展到其他文件

      如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量num,不能分别在两个文件中各自定义一个外部变量num,否则在进行程序的链接时会出现重复定义的错误。正确的做法是:在一个文件定义外部变量Num,而在另一个文件中用extern对num变量作“外部变量声明”,即“extern num”。

      3.将外部变量的作用域限制在本文本中

      有时在程序设计中希望某些外部变量只限于被文本文件所引用,而不能被其他文件所引用。这时可在定义外部变量时加一个static声明。在程序设计中,长由若干人员分别完成各个模块,各人可以独立的在其设计的文件中使用相同的外部变量明而互不相干。只需在每个文件中定义外部变量时加上static关键字即可。

      extern和static也可用于函数的声明和定义。

  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/RanWhoo/p/13271799.html
Copyright © 2011-2022 走看看