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.代码块作用域:一个代码块是包含在开始花括号和对 ...
随机推荐
- SQL Server UDF用户自定义函数
UDF的定义 和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且尅作为一个单元爱进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数, ...
- component to string
component to string string to component ObjectTextToBinary ObjectBinaryToText ReadComponent #include ...
- Netbeans Platform 工程,免安装JDK
使用Netbeans 6.8 创建了一个Netbeans Platform 工程,以Zip形式发布后, 按照以下操作,可 以在客户端免安装JDK: 1. 从已安装JDK的计算机中,提取JDK:eg. ...
- HD1005Number Sequence
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- ld - linker
[ld - linker] NAME ld -- linker SYNOPSIS ld files... [options] [-o outputfile] DESCRIPTION The ld c ...
- oracle学习 二(持续更新中)
oracle数据库的启动停止 以oracle用户身份登录 登录后输入以下命令: oracle-> sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Pro ...
- Java 理论与实践: 流行的原子——新原子类是 java.util.concurrent 的隐藏精华(转载)
简介: 在 JDK 5.0 之前,如果不使用本机代码,就不能用 Java 语言编写无等待.无锁定的算法.在 java.util.concurrent 中添加原子变量类之后,这种情况发生了变化.请跟随并 ...
- SQL2005/8数据库提示单个用户无法操作的解决方法
原因分析: 是操作数据库的用户被锁定了,思路是通过查找目标用户,将其解锁即可,可是这样太麻烦了. 解决办法执行如下sql: USE master; GO DECLARE @SQL VARCHAR( ...
- Objc基础学习记录3
在学习Objective-c中, 数组 1.NSArray, 这是一个不可变的数组,不能修改和删除其中的对象,可以存储任意objective的对象指针. 不能存储int,char类型的,,需要转换为需 ...
- 关于使用Transaction对于非数据库事务的操作
在操作数据库的过程中,为了数据的一致性,我们可以使用Transaction,要么成功的时候全部提交,要么有任何一个操作失败立即全部回滚.不仅仅是在数据库方面,有时候操作其他的内容,比如说对于系统文件的 ...