学习总结

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. M2事后分析汇报总结

    学霸网站项目Postmortem结果 M2之于M1的改进 文档和问答的整合 完成webservice 完成数据库触发器设计与完整性约束依赖(大规模) 优化学霸UI 资源的搜索 外部问题的搜索 文档的上 ...

  2. RFC2119:表示要求的动词(转)

    RFC(Request For Comments)指的关于互联网标准的正式文件,它们的内容必须写得非常清楚. 表达的时候,必须严格区分哪些是"建议"(suggestion),哪些是 ...

  3. CentOS系统下安装配置ftp服务

    安装配置步骤: rpm -ivh /opt/bak/vsftpd-2.2.2-11.el6.x86_64.rpm --本地安装vsftpd ll /etc/vsftpd/  --查看vsftpd的配置 ...

  4. Hibrenate学习的第一天

    问题一:用sqlyog创建一个数据库,用Hibernate传入中文为什么变? 答:在hibernate中的数据连接处要添加 ?useUnicode=true&characterEncoding ...

  5. 不支持C++11 decltype的噩耗

    前言:因为公司现在使用vs2008,所以很多c++11的新特性还未能使用,导致写了很多冤枉代码. 最初引擎的数学库非常简单,使用起来也不方便,例如: float FastLerp(const floa ...

  6. vue 2 滚动条加载更多数据实现

    解析: 判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop.clientHeight.scrollHeight. scrollTop为滚动条在Y轴上的滚动距离. clientHeigh ...

  7. Three ways to set specific DeviceFamily XAML Views in UWP

    Three ways to set specific DeviceFamily XAML Views in UWP http://igrali.com/2015/08/02/three-ways-to ...

  8. css3选择器总结

    1.p[class^/$/*=td]所有p标签的前面带有td/后面带有td/所有带有td的类的三种样式. 2.div:first-child/last-child/nth-child()在父元素下的第 ...

  9. Selenium2+python 常用函数汇总

    1. driver = webdriver.Chrome()  --新建实例 2.driver.find_element_by_id("username") ---通过标签属性id ...

  10. knapsack problem 背包问题 贪婪算法GA

    knapsack problem 背包问题贪婪算法GA 给点n个物品,第j个物品的重量,价值,背包的容量为.应选哪些物品放入包内使物品总价值最大? 规划模型 max s.t. 贪婪算法(GA) 1.按 ...