学习总结

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章 存储类、链接和内存管理的更多相关文章

  1. 《C prime plus (第五版)》 ---第12章 存储类.链接和内存管理

    12-1:存储类: 1.作用域: 代码块作用域,函数原型作用域和文件作用域. 2.链接:分为外部链接,内部链接和空链接.代码块作用域和函数原型作用域都是空连接,意味着是私有的.而文件作用域的变量可能是 ...

  2. CPrimer Plus第12章 存储类、链接和内存管理随笔

    被static修饰的属于内部链接,不可被外部程序文件所使用一般而言,全局变量(文件作用域变量)具有静态存储期,局部变量(代码块作用域变量)具有自动存储期寄存器变量不能使用地址运算符因为被static修 ...

  3. C语言中存储类别、链接与内存管理

      第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...

  4. C Primer Plus--C存储类、链接和内存管理之存储类(storage class)

    目录 存储类 作用域 链接 存储时期 自动变量 寄存器变量 具有代码块作用域的静态变量 具有外部链接的静态变量 extern关键字 具有内部链接的静态变量 多文件 存储类 C为变量提供了5种不同的存储 ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  6. C++ Primer 5th 第12章 动态内存

    练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "th ...

  7. 【C语言学习笔记】存储类、链接和内存管理

    因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容.在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把 ...

  8. C Primer Plus之存储类、链接和内存管理

    存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个 ...

  9. 【足迹C++primer】46、动态存储类

    动态存储类 StrVec Class Design StrVec Class Definition class StrVec { public: //构造函数 StrVec():elements(nu ...

随机推荐

  1. python课程第三周重点记录

    1.关于set,set是一个无序且不重复的元素集合 s = set(["ss","dd","pp"]) #创建set s1 = set([& ...

  2. 安装 CentOS 后的系统配置及软件安装备忘

    安装 CentOS 后的系统配置及软件安装备忘 // */ // ]]>   安装 CentOS 后的系统配置及软件安装备忘 Table of Contents 1 Linux 自举过程 1.1 ...

  3. linuxMint下面的截图工具

    sudo apt-get install shutter 然后配合系统快捷键,我定义的和qq的截屏一样的.用着感觉很舒服.

  4. 页面轮换,ViewFlipper 和 ViewPager 的区别

    ViewFlipper继承ViewAnimator,切换view的时候是有动画效果的,适合做ppt,多界面的程序欢迎引导界面,算是个轻量级的组件,适合展示静态数据,少量数据. ViewPager继承V ...

  5. Fiddler 工作原理

    Fiddler工作原理: 就在在客户端与服务器端创建一个代理服务器: 在开启Fiddler后,Fiddler会自动窜改浏览器的代理,例如我们打开Fiddler,打开IE浏览器--设置--Interne ...

  6. LInux配置jdk(mac和windows)

    我的linux使用的是VMware搭建的虚拟环境,用的是CENTOS6.5 一.准备工作: 1.确定系统安装的是成功的. 2.系统没有其他的问题 3.确定没有安装过其他版本的jdk,两个jdk会反冲 ...

  7. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  8. PHP-Mysqli扩展库的预编译

    (1)预编译的好处 假如要执行100条类似的sql语句,每一次执行,在MySQL端都会进行一次编译,效率很低.提高效率的方法就是--减少编译的次数. 先制造一个sql语句的模板,在MySQL端预先编译 ...

  9. iOS进阶_FMDB的简单使用

    先引入FMDB第三方,点击查看方法 一.创建表 1.创建sql语句    NSString *createSql = @"create table if not exists t_stude ...

  10. 简单BigDecimal运算精度

    项目中遇到了数值运算,如网上所写的,一般有这几个方法: /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ publ ...