【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 ...
随机推荐
- B-Tree 学习
算法导论 第18章 B树与其他树的结构不同的是 B数是多叉而不是二叉树 而且分叉因子很大一般使用于数据库 针对需要硬盘IO的情况而使用 可以降低磁盘IOB树的一个节点是以磁盘的页面为单位,而不是数据 ...
- myeclipse,eclipse打开当前文件所在文件夹
方法一: eclipse打开当前文件所在文件夹的插件Run-->External Tools-->External Tools Configurations...new 一个 progra ...
- html5表单验证
表单验证为终端用户检测无效的数据并标记这些错误,是一种用户体验的优化. 下面展现浏览器自带的验证功能也可在移动端中查看: HTML部分: <!DOCTYPE html> <html ...
- Hibernate-list()与iterate()方法的区别
对于list方法而言,实际上Hibernate是通过一条Select SQL获取所有的记录.并将其读出,填入到POJO中返回.而iterate 方法,则是首先通过一条Select SQL 获取所有符合 ...
- python+eclipse环境搭建
一.Eclipse 的安装 Eclipse的安装是很容易的.Eclipse是基于java的一个应用程序,因此需要一个java的运行环境(JRE)才行.(我这里主要介绍windows下的安装) JRE的 ...
- shell脚本编译安装LAMP环境
#filename lamp.sh#version Centos6.7;apache2.4.23;mariadb-5.5.40;php5.5.38#data 2016/09/28#mail 23853 ...
- CentOS 访问Windows7共享文件夹
在终端中输入命令mount -t cifs -o username="xxx",password="****" //192.168.1.1/share_fold ...
- 解决Android SDK Manager更新、下载速度慢
hosts文件里面原来的内容不做修改,只是添加内容 方法/步骤 先看看如何加快更新速度,再说如何更新. 首先更新host文件,如图,打开目录 C:\Windows\System32\drivers\e ...
- 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败
转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...
- 【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码
详细过程就不表了,看代码吧 import java.util.Arrays; public class Sort { static int swapTimes=0; public static voi ...