学习总结

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. delphi真随机数发生器

    当然不是绝对真随机,是相对真随机数 下载

  2. Archlinux 上 Nginx + PHP + Mariadb + DiscuzX2.5 安装小记

    因为不好找下载集成服务器工具,而且他们自己又打包了一份 php 之类的程序,本身系统就已经有 php 还有数据库什么的了再搞一份受不了,最后选择了手动配置…… 这是一个在 Archlinux 上手动从 ...

  3. 关于unity3D的学习感想

    在老师布置团队项目后组长确定项目是做游戏是,我才接触的Unity3D游戏引擎. 因为一开始我没有接触过这类软件,更没有用过.所以作为一个新手,做好的办 法实在网上找教程.网上说Unity3D是由Uni ...

  4. Android之GridView

    <GridView android:id="@+id/gridView" android:layout_width="match_parent" andr ...

  5. SQL 2005 服务器更计算机名

    select @@ServerNamesp_dropserver '288-BHGKF0MF5G6' sp_addserver '288VIP124','LOCAL' select serverpro ...

  6. 初识C语言

    C语言是开发iOS软件的基础. 一.C语言简介 1.      简史 1)          C语言于1972年发明,首次使用是用于重写UINX操作系统(UNIX以前主要是用汇编语言写的,它奠定了操作 ...

  7. 深入研究C语言 第四篇

    这里更多探究的是指针的机制. 用debug对下面程序进行分析,记录每一条C语句运行后,相关内存单元的值. 程序a.c 注意理解指针机制 我们编写如下代码: 编译加载进debug查看: 我们先看其反汇编 ...

  8. DNS配置

    配置永久IP: cd  /etc/sysconfig/network-scripts/ 主DNS服务器配置: 由于caching-nameserver软件包提供了各种配置文件的模板,大大降低了BIND ...

  9. Sass的基本运算(转载)

    转载于:http://www.cnblogs.com/Medeor/p/4966952.html Sass中的基本运算 一.加法 在 CSS 中能做运算的,到目前为止仅有 calc() 函数可行.但在 ...

  10. Python排列组合问题

    1.字符串的全排列 问题描述:打印出原字符串中所有字符的所有排列.——将输入字符串中的每个字符作为一个不同的字符看待,即使它们是重复的,如'aaa'应打印6次. Python可以用生成器解决: def ...