C中存储类、链接和内存管理
在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中存储类、链接和内存管理的更多相关文章
- 《C prime plus (第五版)》 ---第12章 存储类.链接和内存管理
12-1:存储类: 1.作用域: 代码块作用域,函数原型作用域和文件作用域. 2.链接:分为外部链接,内部链接和空链接.代码块作用域和函数原型作用域都是空连接,意味着是私有的.而文件作用域的变量可能是 ...
- C语言中存储类别、链接与内存管理
第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...
- C Primer Plus--C存储类、链接和内存管理之存储类(storage class)
目录 存储类 作用域 链接 存储时期 自动变量 寄存器变量 具有代码块作用域的静态变量 具有外部链接的静态变量 extern关键字 具有内部链接的静态变量 多文件 存储类 C为变量提供了5种不同的存储 ...
- C Primer Plus--C存储类、链接和内存管理之动态分配内存及类型限定词
目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restr ...
- C++中的类所占内存空间总结
C++中的类所占内存空间总结 最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算 ...
- C++中的类所占内存空间+继承中的成员访问控制
C++学习之继承中的成员访问控制 C++中的类所占内存空间总结
- 【C语言学习笔记】存储类、链接和内存管理
因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容.在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把 ...
- C Primer Plus之存储类、链接和内存管理
存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域 作用域描述了程序中可以访问一个 ...
- 存储类、链接和内存管理(c prime plus)
首先介绍三个概念: (1)作用域:作用域描述了程序中可以访问一个标识符的一个或多个区域. 一共有三种作用域:代码块作用域.函数原型作用域和文件作用域 a.代码块作用域:一个代码块是包含在开始花括号和对 ...
随机推荐
- Openstack之Swift架构(Cloud Storage)
Swift是OpenStack的子项目之一,也称为对象储存,适用于储存永久类型的静态数据,例如:虚拟机镜像文件.图片.存档备份等 复制的三个副本如何联系在一起? 让我们用一些具体场景和介绍一些组件,来 ...
- Netbeans Platform 工程,免安装JDK
使用Netbeans 6.8 创建了一个Netbeans Platform 工程,以Zip形式发布后, 按照以下操作,可 以在客户端免安装JDK: 1. 从已安装JDK的计算机中,提取JDK:eg. ...
- centos安装lxml和pyspider
yum -y install --nogpgcheck python34u-devel.x86_64 yum -y install libcurl-devel yum -y install libxs ...
- c语言指针详解(转载)
转自(http://blog.csdn.net/ad_ad_ad/article/details/1522145) 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指 ...
- Problems running django-admin
“command not found: django-admin”¶ django-admin should be on your system path if you installed Djang ...
- webbench压力测试
webbench最多可以模拟3w多个并发请求去测试网站负载能力. 一:获取webbench工具,安装编译: wget http://blog.zyan.cc/soft/linux/webbench/w ...
- 【转】google推出的SwipeRefreshLayout下拉刷新用法
SwipeRefreshLayout是Google在support v4 19.1版本的library更新的一个下拉刷新组件,实现刷新效果更方便. 使用如下: 1.先下载android-support ...
- C# WinForm开发系列 - RDLC
http://www.cnblogs.com/peterzb/archive/2009/07/08/1519489.html http://jingyan.baidu.com/article/ab69 ...
- 转载:页面加载swf插件:swfobject
转自:http://www.cnblogs.com/analyzer/articles/1299592.html 我一直都在用SWFObject 插入flash,好处多多,代码简洁,不会出现微软的“单 ...
- js 原型的内存分析
使用构造器的弊端:http://www.cnblogs.com/a757956132/p/5258897.html 示例 将行为设置为全局的行为,如果将所有的方法都设计为全局函数的时候, 这个函数就可 ...