在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. OSPF虚链路配置.示例1

      在OSPF 网络中,区域0为骨干区域,其它的为非骨干区域,非骨干区域必须与骨干区域直接相连. 根据拓扑图可看到区域1与骨干区域0直接相连而区域2与骨干区域没有直接相连,这种情况下我们可以创建一条虚 ...

  2. POJ-2785 4 Values whose Sum is 0(折半枚举 sort + 二分)

    题目链接:http://poj.org/problem?id=2785 题意是给你4个数列.要从每个数列中各取一个数,使得四个数的sum为0,求出这样的组合的情况个数. 其中一个数列有多个相同的数字时 ...

  3. 深入理解CRITICAL_SECTION

    临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而人们未能对其深刻理解.在需要跟踪代码中的多线程处理的性能时,对 Windows 中临界区的深刻理解非常有用.本文深 ...

  4. 解决ie6不支持position: fixed;导致无法滚动的办法

    <div id="im" style="top: 100px; position: fixed; left: 5px; border: 3px solid #006 ...

  5. preventDefault stopPropagation??

    棒棒哒~ event.preventDefault https://developer.mozilla.org/zh-CN/docs/Web/API/Event/preventDefault stop ...

  6. javascript数字转汉字中文数字

    /* 工具包 */ var Utils={ /* 单位 */ units:'个十百千万@#%亿^&~', /* 字符 */ chars:'零一二三四五六七八九', /* 数字转中文 @numb ...

  7. 也来说说C#异步委托(转)

    原文地址: http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html 前些日子,看到园子里面有人用老王喝茶的例子讲解了一下同步和异步, ...

  8. Oracle数据库多语言文字存储解决方案

    一.关于字符集 字符集(也称字元集,Character Set)就是字符编码表(codepage),一个字符不论英文.中文.韩文等在计算机系统内存或硬盘中通过二进制的字节(Byte)保存,这个二进制的 ...

  9. NoSQL 数据建模技术(转)

    本文转载自:http://coolshell.cn/articles/7270.html ================================================ 全文译自墙外 ...

  10. JDK - Tomcat - Eclipse - JSP - Servlet 配置运行全攻略

    花了将近两个月的时间,从 JDK 开始一步一步摸索,历经千辛万苦,终于让第一个 Servlet 运行起来了,创建第一个 Servlet  程序确实要比创建第一个 Asp.net 程序困难多了,但是不要 ...