【C语言学习】《C Primer Plus》第12章 存储类、链接和内存管理
学习总结
1、作用域可分为代码块作用域、函数原型作用域或者文件作用域。
代码块作用域例子:
{
for(int i=0;i<10;i++){ //C99允许
… //i的作用域
}
...
}
注:传统上,具有代码块作用域的变量必须在代码块的开始处进行声明,C99放宽这以规则,允许在一个代码中任何位置声明变量。
函数原型作用域例子:
int add(int a, int b);
a和b就是函数原型作用域的变量,在这函数内部都可以使用变量a和b,函数原型关注的是原型参数的类型,并非名字,所以在函数实现时,可以使用其他名字如:
int add(int c, int d){
return c+b;
}
文件作用域例子:
#include <stdio.h>
int sum = 100; //文件作用域
int add(int a, int b);
int main(){
…
}
文件作用域相当于全局变量,在该文件内的左右地方都能使用。
2、链接分为外部链接、内部链接(static)、空连接。拥有外部链接和内部链接作用域的变量都具有静态存储时期,即程序执行期间一直存在。而拥有空连接作用的变量,都具有自动存储时期,当退出代码块时,分配的内存将被释放。
3、动态分配内存函数malloc(int n),n为申请内存字节数;calloc(int n,int m),n为申请内存单元数量,m为内存单元以字节计算的大小,malloc和calloc都是返回申请内存的起始指针,申请失败返回NULL;free((void *) p),p为释放的内存的指针。
#include <stdio.h>
#include <stdlib.h>
int main(void){
int *p;
int i;
p = malloc(*sizeof(int));
if(p==NULL){
exit(EXIT_FAILURE);
} printf("EXIT_FAILURE=%d\n",EXIT_FAILURE); for(i=;i<;i++){
*p = i;
p++;
} printf("p4=%d\n",*--p);
printf("p3=%d\n",*--p);
printf("p2=%d\n",*--p);
printf("p1=%d\n",*--p);
printf("p0=%d\n",*--p); free(p); return ;
}
运行结果:
EXIT_FAILURE=1
p4=4
p3=3
p2=2
p1=1
p0=0
4、free函数边界测试:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int *p;
int i; p = calloc(,sizeof(int));
if(p==NULL){
exit(EXIT_FAILURE);
} for(i==;i<;i++){
*p = i;
p++;
} //情况1:不做任何动作就回收
//p = p-4; //情况2:指针不指向内存的第二个整数单元
//p = p-5; //情况3:指针指回申请内存的第一个整数单元
printf("p=%d\n",*p);
free(p); return ;
}
执行结果:
情况1:报错
情况2:报错
情况3:正常
7、编程题(题8)
#include <stdio.h>
#include <stdlib.h> int * make_array(int elem, int val);
void show_array(const int ar[], int n); int main(void){ int *pa;
int size;
int value; printf("Entet the number of elements:");
scanf("%d",&size);
while(size > ){
printf("Enter the initalization value:");
scanf("%d",&value);
pa = make_array(size, value);
if(pa){
show_array(pa,size);
free(pa);
}
printf("Enter the number of elements(1<1 to quit):");
scanf("%d",&size);
} printf("Done.\n"); return ;
} int * make_array(int elem, int val){ int i;
int *p;
p = (int *)malloc(elem*sizeof(int)); for(i=;i<elem;i++){
p[i]=val;
} return p;
} void show_array(const int ar[], int n){ int i; for(i=;i<=n;i++){
printf("%d",ar[i-]);
if(i!=&&i%==)
printf("\n");
if(i==n && i%!=)
printf("\n");
} }
执行结果:
Entet the number of elements:19
Enter the initalization value:2
22222222
22222222
222
Enter the number of elements(1<1 to quit):8
Enter the initalization value:2
22222222
Enter the number of elements(1<1 to quit):54
Enter the initalization value:4
44444444
44444444
44444444
44444444
44444444
44444444
444444
Enter the number of elements(1<1 to quit):0
Done.
【C语言学习】《C Primer Plus》第12章 存储类、链接和内存管理的更多相关文章
- 《C prime plus (第五版)》 ---第12章 存储类.链接和内存管理
12-1:存储类: 1.作用域: 代码块作用域,函数原型作用域和文件作用域. 2.链接:分为外部链接,内部链接和空链接.代码块作用域和函数原型作用域都是空连接,意味着是私有的.而文件作用域的变量可能是 ...
- CPrimer Plus第12章 存储类、链接和内存管理随笔
被static修饰的属于内部链接,不可被外部程序文件所使用一般而言,全局变量(文件作用域变量)具有静态存储期,局部变量(代码块作用域变量)具有自动存储期寄存器变量不能使用地址运算符因为被static修 ...
- C语言中存储类别、链接与内存管理
第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...
- C Primer Plus--C存储类、链接和内存管理之存储类(storage class)
目录 存储类 作用域 链接 存储时期 自动变量 寄存器变量 具有代码块作用域的静态变量 具有外部链接的静态变量 extern关键字 具有内部链接的静态变量 多文件 存储类 C为变量提供了5种不同的存储 ...
- 12天学好C语言——记录我的C语言学习之路(Day 12)
12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...
- C++ Primer 5th 第12章 动态内存
练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "th ...
- 【C语言学习笔记】存储类、链接和内存管理
因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容.在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把 ...
- C Primer Plus之存储类、链接和内存管理
存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域 作用域描述了程序中可以访问一个 ...
- 【足迹C++primer】46、动态存储类
动态存储类 StrVec Class Design StrVec Class Definition class StrVec { public: //构造函数 StrVec():elements(nu ...
随机推荐
- delphi真随机数发生器
当然不是绝对真随机,是相对真随机数 下载
- break continue.
1.break与continue.这两个关键字一般放在循环的花括号里面使用.break——结束整个循环.continue——结束本次循环,进入下次循环. 2.while循环 //初始条件 while( ...
- 搭建高可用mongodb集群(四)—— 分片
按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...
- 说说C#的async和await 解决卡顿问题 转
C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: 可以看到,async和await关键字只是把上面的代码变得更简单易懂而已. public cla ...
- [转]阿里云CentOS配置全过程
- myeclipse,eclipse打开当前文件所在文件夹
方法一: eclipse打开当前文件所在文件夹的插件Run-->External Tools-->External Tools Configurations...new 一个 progra ...
- eclipse如何安装cdt
原文地址:http://zhidao.baidu.com/link?url=9vSDAkpKJjLIIXP9wFqfjTSf-PmrEr9excDc-A3rzRh46jgzzbud0Z7gzjfxT8 ...
- UrlPager免费分页控件2.0版发布!
UrlPager是一个ASP.NET WebForm应用程序中通过url进行分页的分页控件,支持使用url路由来生成自定义的分页url.与AspNetPager不同,UrlPager需.NET Fra ...
- using 语句中使用的类型必须可隐式转换为“System.IDisposable
在使用 EF 出现 using 语句中使用的类型必须可隐式转换为“System.IDisposable 今天写在这里分享给大家 出现这样的问题,是因为没有引用 EntityFramework 这个程 ...
- Android应用程序Monkey测试
Monkey是Android SDK中附带的一个测试工具:Monkey用于进行压力测试,软件开发人员结合monkey打印日志和系统日志,解决测试中出现的问题. Monkey测试的特点:所有事件都是随机 ...