文档章节

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
【转】Oracle数据库相关的书籍推荐

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

张玉涛
2012/09/05
0
0
天才从哪里来?(Where Does Talent Really Come From?)

有人发现,参加下个月世界杯的足球运动员大多数是上半年出生的。如果再把青年队算进去,这个规律就更明显了。最新一届英格兰青年队里,有一半选手出生在1月、2月和3月,另一半选手出生在其他...

阮一峰
2006/05/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行...

Java填坑之路
20分钟前
1
0
Spring Aop原理之Advisor过滤

在上文(Spring Aop之Advisor解析)中我们讲到,Spring Aop对目标bean的代理主要分为三个步骤:获取所有的Advisor,过滤当前bean可应用的Advisor和使用Advisor为当前bean生成代理对象,并且上文...

爱宝贝丶
31分钟前
0
0
JMockit学习教程

1 JMockit中文网 我觉得如果仅仅是开发自测的话,把JMockit中文网认真看一遍,就可以在项目中使用JMockit了。 http://jmockit.cn/index.htm 2 JMockit中文教程 官方文档中文版。对于不喜欢看...

SuperHeroes
43分钟前
0
0
Linux服务器几乎从不采用Arch Linux?

我们见得多的Linux服务器系统一般都是什么Ubuntu Server啊,什么Cent OS啊,什么Fedora啊,或者企业采用的Red Hat啊,为什么几乎没有Arch Linux呢?下面我将从若干个方面指出Arch Linux在服务...

linux-tao
54分钟前
0
0
js 函数柯里化 闭包

参考 https://mp.weixin.qq.com/s/GEHL3jarDdAAcr5tQGjmDg 一个统计求和的函数 需要知道整个数组的信息,然后遍历求值 function countMoney() { let money = 0 // 温馨提示:arguments...

阿豪boy
57分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部