文档章节

Expert C Programming阅读札记

h
 hiker_urey
发布于 2015/10/18 16:33
字数 640
阅读 8
收藏 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
顶级 Linux 开发者推荐的编程书籍

毫无疑问,Linux 是由那些拥有深厚计算机知识背景而且才华横溢的程序员发明的。让那些大名鼎鼎的 Linux 程序员向如今的开发者分享一些曾经带领他们登堂入室的好书和技术参考资料吧,你会不会...

作者: Steven Vaughan-nichols
11/22
0
0
[北京]猎头代招:知名外企Visual Studio,Team Foundation, .NET,C#职位

Agilent急招职位汇总 联系方式: E-mail:weimi@boostyou.net msn:wei_mi1967@msn.com QQ:723839844 薪资待遇:年薪20W以上 工作地点:北京望京 请根据您自己的技术能力结合JD,从以下4个职位...

邢微
2011/12/23
504
1
国外程序员推荐的免费编程书籍资源

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

职通网
2011/11/07
0
1

没有更多内容

加载失败,请刷新页面

加载更多

《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
35分钟前
1
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
52分钟前
2
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部