在C语言中,有5种不同的存储类型,即存储类。在介绍存储类之前,需要首先简单介绍几个术语。如下:

  作用域:描述程序中可以访问一个标识符的一个或多个区域。一个C变量的作用域可以是代码块作用域、函数原型作用域、或者文件作用域。代码块作用域是在代码块中定义的变量,该变量的作用范围从代码块中变量的定义开始到代码块结束;函数原型作用域从变量定义开始到原型声明的末尾,这就意味着编译器在处理一个函数原型的参数时,只是关心该参数的类型,所以声明一个函数int sum(int x,int y)和int sum(int,int)是一样的;而一个在所用函数之外定义的变量具有文件作用域,具有文件作用域的变量从他定义开始到包含该定义文件的结尾处都是可见的,也被称作全局变量。代码说话:

 #include<stdio.h>

 int x = ;    //x具有文件作用域,在这程序中结尾之前都是可见的
int sum(int m,int n);//m,n具有函数原型作用域,只在申明处可见 int main(int argc, char* argv[])
{
int y = ;//y具有代码块作用域,只在该代码块中可见
}

  存储时期:一个C变量有以下两种存储时期十一:静态存储时期和自动存储时期。所谓静态存储时期,就是一个变量在程序执行期间一直存在,上文所说的具有文件作用域的变量就属于静态存储;对于自动存储时期,则对应上述所说的具有代码块作用域的变量,当程序进入定义这些变量的代码块时,将自动为这些变量分配内存,退出这个代码块时,这些变量所占的内存将会自动被释放。

  链接:链接分为外部链接,内部链接,以及空链接。具有代码块作用域或者函数原型的变量有空链接。具有文件作用域的变量可能有内部链接或者外部链接。区别内部链接和外部链接是由static决定。内部链接由static关键字修饰,表明该变量可以在一个文件的任何地方使用,外部链接没有static修饰,表明该链接可以在一个多文件程序的任何地方使用。

 int x = ;          //文件作用域,外部链接
static int y = ; //文件作用域,内部链接 int main(){
......
}

  下面是5中存储类的对比表格:

  说到这里要介绍一个关键字extern。extern表明你在声明一个已经在别处定义了的变量。下面是几种extern的使用:

  Example.h:

    int z = ;

  源程序:

 #include<stdio.h>
#include "Example.h"
int x = ; int main(int argc, char* argv[])
{
extern int x; //可选的二次声明,我们一般直接使用x,而不采用这种方式
extern int z; //z在Example.h中定义,使用extern之后,便可以在这个文件中使用z }

  同理,函数也可以这样使用。

  对于内存分配,我们讲的是malloc()函数,malloc()函数可以在程序运行时分配更多的内存。它接受一个参数:所需内存字节数。直接上代码:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h> int main(int argc, char* argv[])
{
int * ptr; ptr = (int *)malloc( * sizeof(int));//类型指派(int *)在C中是可选的,但是在C++中是必须的
if(ptr == NULL){
printf("内存不足,无法动态创建指定大小的数组.");
exit(EXIT_FAILURE);
} printf("Before memset():");
for (;i < ;i++)
{
printf("%d,",ptr[i]);
} memset(ptr,,*sizeof(ptr));
printf("\nAfter memset():"); for (i = ;i < ;i++)
{
printf("%d,",ptr[i]);
} printf("\nInit:"); for (i = ;i < ;i++)
{
ptr[i] = i;
} for (i = ;i < ;i++)
{
printf("%d,",ptr[i]);
} free(ptr);
printf("\nfree()\n");
}

  上面的例子使用malloc()函数创建了20个大小为int类型值的空间,如果创建成功,那么该函数会返回那块内存第一个字节的地址并且赋给int类型指针ptr。接下来就可以像使用数组名一样使用它了。malloc()函数分配内存之后不会对其进行初始化,与它相似的还有一个函数calloc()。后者接受两个参数,然后进行创建内存。但是他和malloc()函数不同的是,它会将申请的内存全部初始化为0。不过我们一般不使用calloc()函数申请内存,因为它初始化内存会浪费时间。在上面的程序中,我们初始化使用了函数memset()。

  当我们使用malloc()或者calloc()函数动态申请内存之后,在使用完毕之后,最好使用free()函数来释放分配的内存。不然可能会引起"内存泄露"。

  最后再补充一句:程序所需静态内存数量在编译时就决定了,静态数据在程序载入内存时就被载入了内存。

C中存储类、链接和内存管理的更多相关文章

  1. 《C prime plus (第五版)》 ---第12章 存储类.链接和内存管理

    12-1:存储类: 1.作用域: 代码块作用域,函数原型作用域和文件作用域. 2.链接:分为外部链接,内部链接和空链接.代码块作用域和函数原型作用域都是空连接,意味着是私有的.而文件作用域的变量可能是 ...

  2. C语言中存储类别、链接与内存管理

      第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...

  3. C Primer Plus--C存储类、链接和内存管理之存储类(storage class)

    目录 存储类 作用域 链接 存储时期 自动变量 寄存器变量 具有代码块作用域的静态变量 具有外部链接的静态变量 extern关键字 具有内部链接的静态变量 多文件 存储类 C为变量提供了5种不同的存储 ...

  4. C Primer Plus--C存储类、链接和内存管理之动态分配内存及类型限定词

    目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restr ...

  5. C++中的类所占内存空间总结

    C++中的类所占内存空间总结    最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算 ...

  6. C++中的类所占内存空间+继承中的成员访问控制

    C++学习之继承中的成员访问控制 C++中的类所占内存空间总结

  7. 【C语言学习笔记】存储类、链接和内存管理

    因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容.在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把 ...

  8. C Primer Plus之存储类、链接和内存管理

    存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个 ...

  9. 存储类、链接和内存管理(c prime plus)

    首先介绍三个概念: (1)作用域:作用域描述了程序中可以访问一个标识符的一个或多个区域. 一共有三种作用域:代码块作用域.函数原型作用域和文件作用域 a.代码块作用域:一个代码块是包含在开始花括号和对 ...

随机推荐

  1. LabView中,下拉列表和枚举有什么区别?

    枚举变量只能针对无符号整型数据U32,U16,U8; 而下拉列表则可以包括扩展精度,双精度,单精度,64位.长.双字节.单字节整型以及各种无符号整型(如下图黑色部分). 下拉列表

  2. jquery的clone方法bug的修复

    最近发现jquery的clone的bug,textarea和select的jquery的clone方法有问题,textarea和select的值clone的时候会丢掉,在网上发现一个插件,下载地址如下 ...

  3. UVaLive 6697 Homework Evaluation (DP)

    题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,:如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3, 连续的长字符串添加-,需要减去一个4:也可不给添加-,则 ...

  4. 深入浅出Spring(四) Spring实例分析

    上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...

  5. 测试rest接口的两个工具使用详解(restclient+soapUI)

    http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/31/3110764.html http://www.oschina.net/news/618 ...

  6. c#实现word,winWordControl 文档不允许复制、粘贴、隐藏工具栏、快捷保存

    1.隐藏工具栏 //隐藏工具栏 ; i <= winWordControl1.document.CommandBars.Count; i++) { winWordControl1.documen ...

  7. C# 支付宝接口

    生成URL链接   1using System;  2using System.Data;  3using System.Configuration;  4using System.Collectio ...

  8. jqGrid初次使用遇到的问题及解决方法

    问题一:初始化定义翻页用的导航栏时,表中出现"undefined"方框: 解决:需要导入grid.locale-cn.js文件. 问题二:页面只有一页,无法翻页: 解决:初始化设置 ...

  9. HTML中诡异的空文本

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-03-27) 今天在写代码的时候发现了一个诡异的问题,我的HTML页面代码当中明明没有多余的行,标签书写规范,没有加任何样式( ...

  10. 关于div的居中的问题

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-01-11) div水平和垂直居中,text-align和vertical-align不起作用,因为标签div没有这两个属性, ...