文档章节

Expert C Programming阅读札记

h
 hiker_urey
发布于 2015/10/18 16:33
字数 640
阅读 7
收藏 0
  1. 不要使用函数库中没有对输入数据进行长度检查的函数。 在2.3.3节中展示了gets()在程序中可能导致的缓存越界问题,在现在的编程中应当使用fgets()来确保不会出现对输入长度无限制而导致缓存越界的问题。 因此在所有进行输入或内存拷贝等操作时,都应当使用对输入/拷贝长度进行限制的方法,避免出现越界bug。

  2. 声明 char* const*(*next)(); 的含义。

    A. next是一个指针;

    B. next是一个指向[函数]的指针;

    C. next是一个指向[返回一个[指针]的函数]的指针;

    D. next是一个指向[返回一个[指向类型为char的常量指针的指针]的函数]的指针;

  3. 使用typedef来帮助使声明更易懂。 在ANSI C标准中signal()的声明是:

void (*signal(int sig, void(*func)(int)))(int);
signal是一个函数函数;其返回类型为F,参数类型为int和void(\*func)(int);类型F为void\*(\*func)(int)。
可以有:
typedef void(*ptr_to_func)(int);
ptr_to_func signal(int , ptr_to_func);
这和signal的原始定义完全一致但显然更容易理解。
  1. typedef在对类型进行声明之后不能对声明后的类型进行扩展,这是与使用#define宏之间的显著区别。 例如:
#define dint32 int
 unsigned dint32 udi; 
 typedef int tint32;
 unsigned tint32 uti;  /* 非法! */

另一个区别可以在下面的例子中清晰的呈现出来:

 #define dint_ptr int*
 dint_ptr pA, pB;    /* 实际上可还原为 int* pA, pB; 导致pB类型为int而非int* */
 typedef int* tint_ptr;
 tint_ptr pC, pD;    /* pC和pD的类型均为int* */
  1. 进一步思考typedef。typedef实际上是创建了一个类型的别名,而这个别名的创建方式与变量声明的方式是相似的。
 typedef int (*array_ptr)[100];
 typedef int array[100];
 array_ptr pArr = NULL;
 printf("%d %d\n", sizeof(array_ptr), sizeof(*pArr));     /* 输出:4 400 */
 printf("%d \n", sizeof(array));                          /* 输出:400 */
  1. 大神警示:不要为了方便起见对结构使用typedef。对结构使用typedef唯一的好处是能够省略书写“struct”关键字,但是这个关键字可以可以提示一些信息,不应该被省略。

    typedef应该用在: - 数组、结构、指针以及函数的组合类型; - 可移植类型。例如若你需要一个20比特的类型,可以使用typedef来定义类型,当移植至不同平台时,修改typdef所定义的类型就可以了。

© 著作权归作者所有

共有 人打赏支持
h
粉丝 1
博文 15
码字总数 12905
作品 0
广州
程序员
JS 异步系列 —— Promise 札记

Promise 札记 研究 Promise 的动机大体有以下几点: 对其 api 的不熟悉以及对实现机制的好奇; 很多库(比如 fetch)是基于 Promise 封装的,那么要了解这些库的前置条件得先熟悉 Promise; 要了...

牧云云
07/02
0
0
攻城狮修炼秘籍

漫漫校园生活,孜孜不倦的你,今天书多读一点! 把自己投入知识的海洋吧!为即将成为一名高冷俊俏的程序猿和媛而吹响最后的号角: 各类秘籍自助区 一、测试攻城狮 《软件测试》 《测试之道》...

SVD
2016/09/10
25
0
国外程序员推荐的免费编程书籍资源

StackOverflow 上有位网友(xenoterracide)提问: 我正试着搜集整理一个可在网上免费阅读的计算机编程书籍列表。这些书可以是某种特定编程语言,也可以计算机方面通用书籍。网上有哪些免费可...

职通网
2011/11/07
0
1
June 5. 2018 Week 23rd Tuesday

Learn to let go and be clear of where you really want to head for. 学会放手,同时也要弄清楚自己的真正所爱。 From Kissing a Fool. As an average man, and no longer young, I shoul......

waitingdeng
08/16
0
0
【转】Oracle数据库相关的书籍推荐

文章转自:http://www.dbthink.com/?p=724 1.concepts guide(11g)By Thomas Kyte 由Tom担纲编写的11g的Concepts guide作为第一本书籍,是引领你进去Oracle世界的最基础的一本书籍,建议所有...

张玉涛
2012/09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

等语句含义

经常会看到某些网站的框架中会用到 <!--[if IE7]><![endif]--> 等语句,今天特意查阅了下它们的区别: <!--[if IE]>所有的IE可识别<![end if]--><!--[if !IE]>除IE外都能识别<![end if]-->......

度_
29分钟前
1
0
资源的有限性与任务的复杂性之间的矛盾

看了一篇文章How to Manage Connections Efficiently in Postgres, or Any Database, 文章讨论了如何管理Postgres数据库连接,列举了几种方式: 每个请求一个连接 连接复用 连接池 连接池管理...

52iSilence7
29分钟前
3
0
Python PEP8规范整理

PEP8规范总结 PEP8 是什么呢,简单说就是一种编码规范,是为了让代码“更好看”,更容易被阅读。 具体有这些规范,参考 PEP 8 --Style Guide for Python Code.当然也可以使用Pycharm检查或使...

_Change_
41分钟前
2
0
input去空格

货币转换while True:MonStr = input()if MonStr[:3] == "RMB":USD = eval(MonStr[3:])/6.78print("USD{:.2f}".format(USD))elif MonStr[:3] == "USD":RMB = eval(MonStr[3:......

fadsaa
44分钟前
1
0
单例设计模式

单例设计模式 设计模式介绍与代码编写 在编写程序时经常会遇到一些典型的问题或需要完成某种特定需求.设计模式就是针对这些问题和需求.在大量的实践中总结和理论化之后的代码结构.编程风格以...

码农屌丝
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部