《C Primer Plus》读书笔记——存储类、链接和内存管理
来源:互联网 发布:淘宝网店售后客服总结 编辑:程序博客网 时间:2024/05/16 01:51
背景
距离上次写读书笔记的日子已有半个月了。这段时间一直在做摄像头直立平衡车,也把《C Primer Plus》的中级部分扫了一遍。现在做赛道算法识别遇到瓶颈了,就想把读书笔记补回来。原计划是写指针和数组2的。现在发现还不如直接开新篇,反正之前没写的变长数组之类的也会提及。所以就有这篇存储类、链接和内存管理。虽说这里部分的知识都有在平时码代码时用到,认识得深一点,但是还是有很多过目就忘的,遂烂笔头记之。
存储类
C为变量提供了5种不同的存储模型,或称存储类。还有基于指针的第6种存储模型。可按照一个变量的存储时期(storage duration)、作用域(scope)及链接(linkage)来描述它。
作用域
作用域描述了程序中可以访问一个标识符的一个或多个区域。可以是代码块作用域、函数原型作用域或者文件作用域。
代码块:整个函数体或一个函数内任一复合语句。
C99允许在一个代码块任意位置声明变量:for(int i = 0; i<10; i++) //合法
函数原型:从变量定义处一直到原型声明的末尾。
如变长数组:void use_a_VLA(int n, int m, ar[n][m]);
文件:在所有函数之外定义的变量,即全局变量。
链接
一个C变量具有下列链接之一:外部链接(external linkage),内部链接(internal linkage)或空链接(no linkage)。
- 具有代码块作用域或函数原型作用域的变量有空链接,意味着他们是由其定义所在代码块或函数原型所私有的。
- 具有外部链接:可在多文件使用。
- 具有内部链接:可在单文件使用。
存储时期
一个C变量有以下两种存储时期之一:静态存储时期(static storage duration)和自动存储时期(automatic storage duration)。
- 具有文件作用域的变量具有静态存储时期,它在程序执行期间将一直存在。
注意:对于具有文件作用域的变量,关键词static表明链接类型,并非存储时期。一个使用static声明了的文件作用域变量具有内部链接,而所有的文件作用域变量,无论它具有内部还是外部链接,都具有静态存储时期。 - 具有代码块作用域的变量一般情况下具有自动存储时期。
- 程序进入该代码块,将为这些变量分配内存,退出代码块时,将释放内存。
存储类和函数
函数也有存储类,可以时外部的、静态的或内联的。
若无static,默认是extern。
随机数函数与静态变量
/* 自写随机数函数,包含两文件 *//* s_and_r.c */static unsigned long int next = 1; //种子int rand(void){ /*产生伪随机数的公式*/ next = next * 1103515245 + 12345; return (unsigned int)(next / 65536) % 32768;}void srand(unsigned int seed){ next = seed;}/* r_drive.c */#include <stdio.h>extern void srand(unsigned int x);extern int rand(void);int main(void){ int count; unsigned seed; printf("Please enter your choice for seed.\n"); while(scanf("%u", &seed) == 1) { srand(seed); //重置种子 for(count = 0; count < 5; count++) printf("%hd\n", rand() ); printf("Please enter next seed (q to quit):\n"); //实际上输入的不是无符号十进制数应该就可以退出 } printf("Done.\n"); return 0;}
另外还有利用计算机掷出非现实的任意个任意面骰子的程序。
分配内存:malloc()和free()
函数malloc() 接受一个参数:所需内存字节数。然后malloc()找到可用内存中一个大小适合的块。内存是匿名的,即malloc()分配了内存,但没有为它指定名字。然而,它可以返回那块内存第一个字节的地址。因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。malloc()可指向char或void(通用指针)的指针,可返回数组指针、结构指针等等。若找不到所需的空间,它将返回空指针。
double * ptd; //声明指针来存放块在内存中的位置ptd = (double *)malloc(30 * sizeof(double)); //使用malloc请求一个存储块,类型指派(double *)在C中可选,在C++必须。
这段代码请求30个double类型值的空间,并把ptd指向该空间所在位置。注意ptd是作为指向一个double类型值的指针声明的。数组的名字是它第一个元素的地址。可用ptd[n]来访问第n个元素。
现在,创建一个数组有三种方法:
- 声明一个数组,声明时用常量表达式指定数组维数,然后可用数组名访问数组元素。
- 声明一个变长数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素。
- 声明一个指针,调用malloc(),然后使用该指针来访问数组元素。
一般地,对应每个malloc(),应调用一次free()。free的参数是先前malloc返回的地址,它释放先前分配的内存。在函数末尾处调用free()可防止内存泄漏(memory leak)。
存储类与动态内存分配
理想的程序将其可用内存分为三个独立的部分:一个是具有外部、内部及空链接的静态变量的;一个是自动变量的,另一个是动态内存分配的。
- 声明不同存储类,变量使用内存时间不同,将这一部分内存处理为一个堆栈。这样的新变量在内存中创建时按顺序加入,消亡时按相反顺序移除。
- 动态分配的内存在调用malloc等时产生,调用free时释放。这样的内存可能是碎片状的。
- 《C Primer Plus》读书笔记——存储类、链接和内存管理
- C primer plus 学习之存储类、链接、内存管理
- 【C Primer Plus】第十二章 存储类、链接和内存管理
- C primer plus第12章(存储类、链接和内存管理)
- C primer plus第12章(存储类、链接和内存管理)习题
- C Primer Plus第12章 存储类、链接和内存管理随笔
- C Primer Plus 第12章 存储类、链接和内存管理
- c primer plus第12章总结:存储类、连接和内存管理
- 《C Primer Plus 5th》读书笔记----存储类、链接、类型限定词
- C++Primer Plus读书笔记 9.2.1作用域和链接
- C Primer Plus 第十二章:储存类别,链接和内存管理
- C -- 存储类、链接和内存管理
- 《C Primer Plus》读书笔记——递归
- [C] 存储类——《C Primer Plus》
- C语言学习笔记1——存储类、链接和内存管理
- 嵌入式软件开发培训笔记——C高级 存储类、链接和内存管理
- C-PRIMER PLUS读书笔记
- C-PRIMER PLUS读书笔记
- 二、搭建memcached集群memcached+magent+repcache
- XAMPP 安装后启动Apache报错的问题与解决
- java基础复习------>抽象类能初始化吗?
- CURL采集图片代码
- 2017的计划
- 《C Primer Plus》读书笔记——存储类、链接和内存管理
- 第二行代码--第一章学习笔记
- 蓝桥杯java排序之快速排序
- 你所不知道的setTimeout
- php做模板替换
- 深入理解Activity启动流程(四)–Activity Task的调度算法
- 如何查看授权的所有用户
- SQL 第五章 我的租房网
- 几分钟搞定 OpenStack Heat AutoScaling 根据CPU 自动伸缩VM